diff --git a/lisa/sut_orchestrator/baremetal/ip_power.py b/lisa/sut_orchestrator/baremetal/ip_power.py index b82d933d56..96faa27998 100644 --- a/lisa/sut_orchestrator/baremetal/ip_power.py +++ b/lisa/sut_orchestrator/baremetal/ip_power.py @@ -6,11 +6,14 @@ import requests from lisa import schema -from lisa.util import ContextMixin, InitializableMixin, subclasses +from lisa.util import ContextMixin, InitializableMixin, LisaException, subclasses from lisa.util.logger import get_logger from .schema import IPPowerSchema +REQUEST_TIMEOUT = 3 +REQUEST_SUCCESS_CODE = 200 + class IPPower(subclasses.BaseClassWithRunbookMixin, ContextMixin, InitializableMixin): def __init__(self, runbook: IPPowerSchema) -> None: @@ -21,10 +24,10 @@ def __init__(self, runbook: IPPowerSchema) -> None: def type_schema(cls) -> Type[schema.TypedSchema]: return IPPowerSchema - def on(self, port: int) -> None: + def on(self, port: str) -> None: raise NotImplementedError() - def off(self, port: int) -> None: + def off(self, port: str) -> None: raise NotImplementedError() @@ -32,7 +35,7 @@ class Ip9285(IPPower): def __init__(self, runbook: IPPowerSchema) -> None: super().__init__(runbook) self._request_cmd = ( - f"http://{runbook.hostname}/set.cmd?" + f"http://{runbook.host}/set.cmd?" f"user={runbook.username}+pass=" f"{runbook.password}+cmd=setpower+P6" ) @@ -45,10 +48,21 @@ def type_name(cls) -> str: def type_schema(cls) -> Type[schema.TypedSchema]: return IPPowerSchema - def on(self, port: int) -> None: + def on(self, port: str) -> None: request_on = f"{self._request_cmd}{port}=1" - requests.get(request_on) + self._set_ip_power(request_on) - def off(self, port: int) -> None: + def off(self, port: str) -> None: request_off = f"{self._request_cmd}{port}=0" - requests.get(request_off) + self._set_ip_power(request_off) + + def _set_ip_power(self, power_cmd: str) -> None: + try: + response = requests.get(power_cmd, timeout=REQUEST_TIMEOUT) + response.raise_for_status() + except requests.HTTPError as http_err: + raise LisaException(f"HTTP error: {http_err} in set_ip_power occurred") + except Exception as err: + raise LisaException(f"Other Error: {err} in set_ip_power occurred") + else: + self._log.debug(f"Command {power_cmd} in set_ip_power done") diff --git a/lisa/sut_orchestrator/baremetal/schema.py b/lisa/sut_orchestrator/baremetal/schema.py index 65d8bbb336..39bd365a70 100644 --- a/lisa/sut_orchestrator/baremetal/schema.py +++ b/lisa/sut_orchestrator/baremetal/schema.py @@ -66,6 +66,24 @@ class KeyLoaderSchema(schema.TypedSchema, schema.ExtendableSchemaMixin): type: str = field(default="build", metadata=field_metadata(required=True)) +@dataclass_json() +@dataclass +class BootConfigSchema(schema.TypedSchema, schema.ExtendableSchemaMixin): + type: str = field(default="boot_config", metadata=field_metadata(required=True)) + + +@dataclass_json() +@dataclass +class IPPowerSchema(schema.TypedSchema, schema.ExtendableSchemaMixin): + type: str = field(default="Ip9285", metadata=field_metadata(required=True)) + host: str = "" + username: str = "" + password: str = "" + + def __post_init__(self, *args: Any, **kwargs: Any) -> None: + add_secret(self.password) + + @dataclass_json() @dataclass class ClusterSchema(schema.TypedSchema, schema.ExtendableSchemaMixin):