Skip to content

Commit 6952f14

Browse files
PaulVittorinoBastian-Krause
authored andcommitted
driver/powerdriver: ykushpower: board_name support
When 6425df9 switched from pykush to ykushcmd, support for the YKUSH 3 and YKUSH XS was lost. Restore support for those boards by passing the board_name argument to ykushcmd. The board_name is determined by listing the attached YKUSH boards by model. Added tests for YKUSHPowerPort and YKUSHPowerDriver. Signed-off-by: Paul Vittorino <paul.vittorino@garmin.com> [bst: rebased, added self.port.command_prefix to model detection for remote access, dropped redundant/unrelated test_import_backend_poe_mib] Signed-off-by: Bastian Krause <bst@pengutronix.de>
1 parent dbd4b11 commit 6952f14

3 files changed

Lines changed: 100 additions & 8 deletions

File tree

doc/configuration.rst

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -296,18 +296,19 @@ Used by:
296296

297297
YKUSHPowerPort
298298
++++++++++++++
299-
A :any:`YKUSHPowerPort` describes a *YEPKIT YKUSH* USB (HID) switchable USB
300-
hub.
299+
A :any:`YKUSHPowerPort` describes a *YEPKIT YKUSH*-family USB (HID)
300+
switchable USB hub.
301+
Models supported include YKUSH, YKUSH 3, and YKUSH XS.
301302

302303
.. code-block:: yaml
303304
304305
YKUSHPowerPort:
305-
serial: 'YK12345'
306+
serial: 'Y3N12345'
306307
index: '1'
307308
308-
The example describes port 1 on the YKUSH USB hub with the
309-
serial ``YK12345``.
310-
Use ``ykushcmd -l`` to get your serial number.
309+
The example describes port 1 on the YKUSH 3 USB hub with the
310+
serial ``Y3N12345``.
311+
Use ``ykushcmd ykush3 -l`` to get your serial number.
311312

312313
Arguments:
313314
- serial (str): serial number of the YKUSH hub

labgrid/driver/powerdriver.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import attr
77

8+
from ..exceptions import InvalidConfigError
89
from ..factory import target_factory
910
from ..protocol import PowerProtocol, DigitalOutputProtocol, ResetProtocol
1011
from ..resource import NetworkPowerPort
@@ -283,11 +284,27 @@ def __attrs_post_init__(self):
283284
else:
284285
self.tool = 'ykushcmd'
285286

287+
def on_activate(self):
288+
# Search for the model of the YKUSH device
289+
for model in ["ykush", "ykushxs", "ykush3"]:
290+
cmd = self.port.command_prefix + [
291+
self.tool,
292+
model,
293+
"-l"
294+
]
295+
output = processwrapper.check_output(cmd)
296+
if self.port.serial in output.decode("utf-8"):
297+
self.model = model
298+
break
299+
else:
300+
raise InvalidConfigError(f"Could not find YKUSH device with serial {self.port.serial}")
301+
286302
@Driver.check_active
287303
@step()
288304
def on(self):
289305
cmd = [
290306
self.tool,
307+
self.model,
291308
"-s", f"{self.port.serial}",
292309
"-u", f"{self.port.index}"
293310
]
@@ -298,6 +315,7 @@ def on(self):
298315
def off(self):
299316
cmd = [
300317
self.tool,
318+
self.model,
301319
"-s", f"{self.port.serial}",
302320
"-d", f"{self.port.index}"
303321
]
@@ -314,6 +332,7 @@ def cycle(self):
314332
def get(self):
315333
cmd = [
316334
self.tool,
335+
self.model,
317336
"-s", f"{self.port.serial}",
318337
"-g", f"{self.port.index}"
319338
]

tests/test_powerdriver.py

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,14 @@
22

33
import pytest
44

5-
from labgrid.resource import NetworkPowerPort
6-
from labgrid.driver.powerdriver import ExternalPowerDriver, ManualPowerDriver, NetworkPowerDriver
5+
from labgrid.resource import NetworkPowerPort, YKUSHPowerPort
6+
from labgrid.driver.powerdriver import (
7+
ExternalPowerDriver,
8+
ManualPowerDriver,
9+
NetworkPowerDriver,
10+
YKUSHPowerDriver,
11+
)
12+
from labgrid.util.helper import processwrapper
713

814

915
class TestManualPowerDriver:
@@ -307,3 +313,69 @@ def test_import_backend_siglent(self):
307313
def test_import_backend_poe_mib(self):
308314
pytest.importorskip("pysnmp")
309315
import labgrid.driver.power.poe_mib
316+
317+
class TestYKUSHPowerDriver:
318+
YKUSH_FAKE_SERIAL = "YK12345"
319+
YKUSH_LIST_OUTPUT = f"Attached YKUSH Boards:\n1. Board found with serial number: {YKUSH_FAKE_SERIAL}".encode(
320+
"utf-8"
321+
)
322+
YKUSH3_FAKE_SERIAL = "Y3N10673"
323+
YKUSH3_LIST_OUTPUT = f"Attached YKUSH3 Boards:\n1. Board found with serial number: {YKUSH3_FAKE_SERIAL}".encode(
324+
"utf-8"
325+
)
326+
YKUSHXS_LIST_OUTPUT = (
327+
"Attached YKUSH XS Boards:\n1. Board found with serial number: YKU1234".encode(
328+
"utf-8"
329+
)
330+
)
331+
332+
def test_create(self, target):
333+
resource = YKUSHPowerPort(
334+
target, "power", serial=self.YKUSH_FAKE_SERIAL, index=1
335+
)
336+
device = YKUSHPowerDriver(target, "power")
337+
assert isinstance(device, YKUSHPowerDriver)
338+
339+
def test_default_off(self, target, mocker):
340+
check_output_mock = mocker.patch(
341+
"labgrid.util.helper.processwrapper.check_output"
342+
)
343+
check_output_mock.side_effect = [
344+
self.YKUSH_LIST_OUTPUT,
345+
self.YKUSHXS_LIST_OUTPUT,
346+
self.YKUSH3_LIST_OUTPUT,
347+
b"",
348+
]
349+
resource = YKUSHPowerPort(
350+
target, "power", serial=self.YKUSH_FAKE_SERIAL, index=2
351+
)
352+
resource.avail = True
353+
device = YKUSHPowerDriver(target, "power")
354+
target.activate(device)
355+
device.off()
356+
357+
check_output_mock.assert_called_with(
358+
["ykushcmd", "ykush", "-s", self.YKUSH_FAKE_SERIAL, "-d", "2"]
359+
)
360+
361+
def test_ykush3_on(self, target, mocker):
362+
check_output_mock = mocker.patch(
363+
"labgrid.util.helper.processwrapper.check_output"
364+
)
365+
check_output_mock.side_effect = [
366+
self.YKUSH_LIST_OUTPUT,
367+
self.YKUSHXS_LIST_OUTPUT,
368+
self.YKUSH3_LIST_OUTPUT,
369+
b"",
370+
]
371+
resource = YKUSHPowerPort(
372+
target, "power", serial=self.YKUSH3_FAKE_SERIAL, index=3
373+
)
374+
resource.avail = True
375+
device = YKUSHPowerDriver(target, "power")
376+
target.activate(device)
377+
device.on()
378+
379+
check_output_mock.assert_called_with(
380+
["ykushcmd", "ykush3", "-s", self.YKUSH3_FAKE_SERIAL, "-u", "3"]
381+
)

0 commit comments

Comments
 (0)