From a39e1f59da51220691e439555ac910fa1b40c833 Mon Sep 17 00:00:00 2001 From: Maciej Nycz Date: Mon, 16 Oct 2017 16:51:46 +0200 Subject: [PATCH] [harness-automation] add IpPowerSocketPduController class (#2247) --- .../autothreadharness/pdu_controller.py | 39 +++++++++++++++++++ .../pdu_controller_factory.py | 2 + .../autothreadharness/settings_sample.py | 7 ++++ 3 files changed, 48 insertions(+) diff --git a/tools/harness-automation/autothreadharness/pdu_controller.py b/tools/harness-automation/autothreadharness/pdu_controller.py index 4950cf894..e5098aa92 100644 --- a/tools/harness-automation/autothreadharness/pdu_controller.py +++ b/tools/harness-automation/autothreadharness/pdu_controller.py @@ -33,6 +33,13 @@ import re import telnetlib import time +try: + # python 2 + from urllib2 import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener +except ImportError: + # python 3 + from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener + logger = logging.getLogger(__name__) @@ -180,6 +187,38 @@ class NordicBoardPduController(PduController): def close(self): pass + +class IpPowerSocketPduController(PduController): + + def open(self, **params): + self._base_url = 'http://{}/outs.cgi?out'.format(params['ip']) + password_manager = HTTPPasswordMgrWithDefaultRealm() + password_manager.add_password(None, self._base_url, params['user'], params['pass']) + authentication_handler = HTTPBasicAuthHandler(password_manager) + self._opener = build_opener(authentication_handler) + + def reboot(self, **params): + logger.info('Executing power cycle') + for socket in params['sockets']: + self._turn_off(socket) + time.sleep(2) + self._turn_on(socket) + time.sleep(2) + + def _change_state(self, socket, state): + self._opener.open('{}{}={}'.format(self._base_url, socket, state)) + + def _turn_off(self, socket): + self._change_state(socket, 1) + + def _turn_on(self, socket): + self._change_state(socket, 0) + + def close(self): + self._base_url = None + self._opener = None + + class ManualPduController(PduController): def open(self, **kwargs): diff --git a/tools/harness-automation/autothreadharness/pdu_controller_factory.py b/tools/harness-automation/autothreadharness/pdu_controller_factory.py index d585c059b..1f0531ca0 100644 --- a/tools/harness-automation/autothreadharness/pdu_controller_factory.py +++ b/tools/harness-automation/autothreadharness/pdu_controller_factory.py @@ -36,6 +36,8 @@ class PduControllerFactory(object): return pdu_controller.NordicBoardPduController() elif _type == 'APC_PDU_CONTROLLER': return pdu_controller.ApcPduController() + elif _type == 'IP_POWER_SOCKET_PDU_CONTROLLER': + return pdu_controller.IpPowerSocketPduController() elif _type == 'MANUAL_PDU_CONTROLLER': return pdu_controller.ManualPduController() else: diff --git a/tools/harness-automation/autothreadharness/settings_sample.py b/tools/harness-automation/autothreadharness/settings_sample.py index e334d4e6f..add519810 100644 --- a/tools/harness-automation/autothreadharness/settings_sample.py +++ b/tools/harness-automation/autothreadharness/settings_sample.py @@ -95,6 +95,7 @@ Types of supported PDU controllers: - None - when no PDU controller connected - 'APC_PDU_CONTROLLER' - when APC PDU controller connected - 'NORDIC_BOARD_PDU_CONTOLLER' - when Nordic boards PDU controller connected + - 'IP_POWER_SOCKET_PDU_CONTROLLER' - when IP Power Socket 5G10A connected """ PDU_CONTROLLER_OPEN_PARAMS = {'port': 23, 'ip': '127.0.0.1'} @@ -105,6 +106,9 @@ Example parameters for the 'APC_PDU_CONTROLLER': Example parameters for the 'NORDIC_BOARD_PDU_CONTOLLER': {} - empty dictionary + +Example parameters for the 'IP_POWER_SOCKET_PDU_CONTROLLER': + {'user': 'user', 'pass': 'pass', 'ip': '127.0.0.1'} """ PDU_CONTROLLER_REBOOT_PARAMS = {'outlet': 1} @@ -115,6 +119,9 @@ Example parameters for the 'APC_PDU_CONTROLLER': Example parameters for the 'NORDIC_BOARD_PDU_CONTOLLER': {'boards_serial_numbers': ('12345123', ...)} + +Example parameters for the 'IP_POWER_SOCKET_PDU_CONTROLLER': + {'sockets': [0, 1]} """ SHIELD_CONTROLLER_TYPE = None