Files
test/keywords/server/power_keywords.py
abhinav_ayyapasetti 1fabfc59ee pylint fix
Description:
- Added data types to function arguments and return values.
- Added blank lines between summary and description in docstrings to match style guidelines.
- Removed extra blank lines after docstrings.
- Added a missing import for SSHConnection in sma_keywords.py.
- Capitalized the first word in each docstring to comply with style guide rules.
- Improved docstring for PTP4LStatusObject constructor with detailed attribute descriptions

Change-Id: Idada0b0b0c3f895a16f4b439beaaaf071597a16a

Change-Id: I8e7756d32eb56a2aa85b277a91b26cc6280d1c56
Signed-off-by: aabhinav <ayyapasetti.abhinav@windriver.com>
2025-07-09 19:38:14 +00:00

142 lines
5.8 KiB
Python

import time
from framework.exceptions.keyword_exception import KeywordException
from framework.logging.automation_logger import get_logger
from framework.ssh.ssh_connection import SSHConnection
from keywords.base_keyword import BaseKeyword
from keywords.bmc.ipmitool.chassis.power.ipmitool_chassis_power_keywords import IPMIToolChassisPowerKeywords
from keywords.bmc.ipmitool.chassis.status.ipmitool_chassis_status_keywords import IPMIToolChassisStatusKeywords
from keywords.cloud_platform.fault_management.alarms.alarm_list_keywords import AlarmListKeywords
from keywords.cloud_platform.system.host.system_host_list_keywords import SystemHostListKeywords
class PowerKeywords(BaseKeyword):
"""
Class for generic power keywords
"""
def __init__(self, ssh_connection: SSHConnection):
self.ssh_connection = ssh_connection
def power_on(self, host_name: str) -> bool:
"""
Powers on the given host and waits for the host to be in a good state
Args:
host_name (str): the name of the host
Returns:
bool: True if host powers on successfully
Raises:
KeywordException: if host fails to power on within the expected time
"""
IPMIToolChassisPowerKeywords(self.ssh_connection, host_name).power_on()
if not self.is_powered_on(host_name):
host_value = SystemHostListKeywords(self.ssh_connection).get_system_host_list().get_host(host_name)
raise KeywordException("Power on host did not power on in the required time. Host values were: " f"Operational: {host_value.get_operational()} " f"Administrative: {host_value.get_administrative()} " f"Availability: {host_value.get_availability()}")
return True
def is_powered_on(self, host_name: str, power_on_wait_timeout: int = 1800) -> bool:
"""
Checks that the host is powered on and in a good state
Args:
host_name (str): the name of the host
power_on_wait_timeout (int): the time to wait for the host to be powered on
Returns:
bool: True if the host is powered on, healthy and has no failure alarms ; False otherwise
"""
timeout = time.time() + power_on_wait_timeout
refresh_time = 5
is_power_on = False
is_host_list_ok = False
is_alarms_list_ok = False
while time.time() < timeout:
try:
status = IPMIToolChassisStatusKeywords(self.ssh_connection, host_name).get_ipmi_chassis_status()
if status.system_power == "on":
get_logger().log_info("The host is powered on.")
is_power_on = True
# Check System Host-List
host_value = SystemHostListKeywords(self.ssh_connection).get_system_host_list().get_host(host_name)
is_host_list_ok = host_value.is_host_healthy()
# Check the alarms of the host
alarms = AlarmListKeywords(self.ssh_connection).alarm_list()
is_alarms_list_ok = True
for alarm in alarms:
if alarm.get_alarm_id() == "200.004" or alarm.get_alarm_id() == "200.005" or alarm.get_alarm_id() == "750.006": #
is_alarms_list_ok = False
if is_alarms_list_ok:
get_logger().log_info("There are no critical failures alarms")
# Exit the loop once all conditions are met.
if is_host_list_ok and is_alarms_list_ok and is_power_on:
return True
except Exception:
get_logger().log_info(f"Found an exception when checking the health of the system. Trying again after {refresh_time} seconds")
time.sleep(refresh_time)
return False
def power_off(self, host_name: str) -> bool:
"""
Powers off the host
Args:
host_name (str): the name of the host
Returns:
bool: True if powered off
Raises:
KeywordException: if host fails to power off within the expected time
"""
IPMIToolChassisPowerKeywords(self.ssh_connection, host_name).power_off()
if not self.is_powered_off(host_name):
host_value = SystemHostListKeywords(self.ssh_connection).get_system_host_list().get_host(host_name)
raise KeywordException("Power off host did not power off in the required time. Host values were: " f"Operational: {host_value.get_operational()} " f"Administrative: {host_value.get_administrative()} " f"Availability: {host_value.get_availability()}")
return True
def is_powered_off(self, host_name: str) -> bool:
"""
Waits for the host to be powered off
Args:
host_name (str): the name of the host
Returns:
bool: True if host powered off and host operations are disabled; False otherwise
"""
timeout = time.time() + 600
is_power_off = False
is_host_list_ok = False
while time.time() < timeout:
try:
status = IPMIToolChassisStatusKeywords(self.ssh_connection, host_name).get_ipmi_chassis_status()
if status.system_power == "off":
get_logger().log_info("The host is powered off.")
is_power_off = True
host_value = SystemHostListKeywords(self.ssh_connection).get_system_host_list().get_host(host_name)
if host_value.get_availability() == "offline" and host_value.get_operational() == "disabled":
is_host_list_ok = True
if is_power_off and is_host_list_ok:
return True
except Exception:
get_logger().log_info("Found an exception when checking the health of the system. Trying again")
time.sleep(5)
return False