|
1 | 1 | import shlex
|
| 2 | +import subprocess |
2 | 3 | import time
|
3 | 4 | import math
|
4 | 5 | from importlib import import_module
|
@@ -488,3 +489,53 @@ def get(self):
|
488 | 489 | return False
|
489 | 490 | else:
|
490 | 491 | raise ExecutionError(f"got unexpected power status {power}")
|
| 492 | + |
| 493 | + |
| 494 | +@target_factory.reg_driver |
| 495 | +@attr.s(eq=False) |
| 496 | +class IPMIPowerDriver(Driver, PowerResetMixin, PowerProtocol): |
| 497 | + """IPMIPowerDriver - Driver using an IPMI PowerPort""" |
| 498 | + bindings = {"port": "IPMIPowerPort", } |
| 499 | + delay = attr.ib(default=5.0, validator=attr.validators.instance_of(float)) |
| 500 | + |
| 501 | + def _ipmi_power(self, cmd): |
| 502 | + runstr = f"ipmi-power -h {self.port.host} -u {self.port.username} " |
| 503 | + runstr += f"--session-timeout={self.port.timeout*1000} " |
| 504 | + runstr += f"-p {self.port.password} {cmd}" |
| 505 | + runstr = runstr.split(' ') |
| 506 | + if len(self.port.args) > 0: |
| 507 | + runstr.append(self.port.args) |
| 508 | + return subprocess.run(runstr, capture_output=True) |
| 509 | + |
| 510 | + def _ipmi_cmd(self, cmd): |
| 511 | + ret = self._ipmi_power(cmd) |
| 512 | + stdout = ret.stdout.decode('utf-8').split(' ') |
| 513 | + assert self.port.host == stdout[0][:-1] |
| 514 | + assert "ok" == stdout[1][:-1] |
| 515 | + |
| 516 | + @Driver.check_active |
| 517 | + @step() |
| 518 | + def on(self): |
| 519 | + self._ipmi_cmd('--on') |
| 520 | + |
| 521 | + @Driver.check_active |
| 522 | + @step() |
| 523 | + def off(self): |
| 524 | + self._ipmi_cmd('--off') |
| 525 | + |
| 526 | + @Driver.check_active |
| 527 | + @step() |
| 528 | + def cycle(self): |
| 529 | + self._ipmi_cmd('--cycle') |
| 530 | + |
| 531 | + @Driver.check_active |
| 532 | + def get(self): |
| 533 | + ret = self._ipmi_power('--stat') |
| 534 | + stdout = ret.stdout.decode('utf-8').split(' ') |
| 535 | + assert self.port.host == stdout[0][:-1] |
| 536 | + power = stdout[1][:-1] |
| 537 | + if power == 'off': |
| 538 | + return False |
| 539 | + elif power == 'on': |
| 540 | + return True |
| 541 | + raise ExecutionError(f"got unexpected power status {power}") |
0 commit comments