blob: f2c0e94979abbece5f3430feb914c3f9a1275076 [file] [log] [blame]
*** Settings ***
Documentation Test power supply telemetry.
Resource ../lib/openbmc_ffdc.robot
Resource ../lib/open_power_utils.robot
Resource ../lib/boot_utils.robot
Resource ../lib/logging_utils.robot
Test Teardown FFDC On Test Case Fail
*** Variables ***
# -----------------------------------
# Output Current and Wattage Limits
# -----------------------------------
# * 200 VAC (200 - 208 VAC) ... 2104W
# * 230 VAC (207 - 253 VAC) ... 2226W
# * 277 VAC (249 - 305 VAC) ... 2226W
# -----------------------------------
# With a loaded HTX work-load the wattage is typically within half of the upper
# limit. If the power drawn goes beyond the upper power limit, this test will
# fail.
${upper_power_limit} ${2104}
${lower_power_limit} ${100}
${power_data_collection_interval} ${30}
# Every n seconds, the system collects the following for each power supply
# (e.g. ps0, ps1, etc):
# - The average power being drawn over the interval.
# - The maximum power drawn over the interval.
# At any given time, such readings can be obtained from the system.
# The lists shown below are examples of such data
# ---------------------------------------------------------------------
# /org/open_power/sensors/aggregation/per_30s/ps0_input_power/average
# [20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 225, 290, 255, 207, 124, 20]
# (max, min) (290, 20)
# /org/open_power/sensors/aggregation/per_30s/ps1_input_power/average
# [19, 19, 20, 20, 19, 20, 20, 20, 20, 20, 69, 321, 286, 265, 228, 104]
# (max, min) (321, 19)
# /org/open_power/sensors/aggregation/per_30s/ps0_input_power/maximum
# [20, 20, 20, 22, 22, 22, 22, 20, 22, 22, 338, 346, 308, 258, 172, 20]
# (max, min) (346, 20)
# /org/open_power/sensors/aggregation/per_30s/ps1_input_power/maximum
# [24, 26, 26, 26, 26, 26, 26, 26, 26, 26, 322, 364, 338, 308, 258, 240]
# (max, min) (364, 24)
# ---------------------------------------------------------------------
# To collect 3 iteration of sampling data.
${LOOP_COUNT} ${3}
*** Test Cases ***
Power Supply Test When Host Off
[Documentation] Check that power consumption is within limits when host
... is off.
[Tags] Power_Supply_Test_When_Host_Off
REST Power Off stack_mode=skip
${power_sensor_path}= Get Sensors Aggregation URL List
... /org/open_power/sensors/
Check Power Telemetry When Host Off ${power_sensor_path}
Power Supply Test When Host On
[Documentation] Check that power consumption is within limits when host
... is on.
[Tags] Power_Supply_Test_When_Host_On
REST Power On
${power_sensor_path}= Get Sensors Aggregation URL List
... /org/open_power/sensors/
Repeat Keyword ${LOOP_COUNT} times
... Check Power Telemetry When Host On ${power_sensor_path}
Power Supply Error Logging Test At Runtime
[Documentation] Check that power supply error is logged when one of the
... power supply inputs is unplugged.
[Tags] Power_Supply_Error_Logging_Test_At_Runtime
[Teardown] Run Keywords FFDC On Test Case Fail AND
... Set Power Supply Present ${1}
REST Power On stack_mode=skip
Set Power Supply Present ${0}
Wait Until Keyword Succeeds 30 sec 10 sec
... Logging Entry Should Exist
... xyz.openbmc_project.Inventory.Error.NotPresent
*** Keywords ***
Check Power Telemetry When Host On
[Documentation] Check that power consumption is within limits when host
... is on.
[Arguments] ${power_paths}
# Description of argument(s):
# power_paths A list of power paths (example list element
# "/org/open_power/sensors/aggregation/per_30s/ps0_input_power/average").
Reset 30s Aggregation Power Readings
# sleep for 3 minutes to get 6-7 readings.
Sleep 3m
# Check for "average" aggregation.
FOR ${power_path} IN @{power_paths[0]}
${averages}= Get Sensors Aggregation Data ${power_path}
${max} ${min}= Evaluate (max(@{averages}), min(@{averages}))
Should Be True ${max} < ${upper_power_limit}
... msg=Wattage ${max} crossed ${upper_power_limit}.
Should Be True ${min} >= ${lower_power_limit}
... msg=Wattage ${min} below ${lower_power_limit}.
END
# Check for "maximum" aggregation.
FOR ${power_path} IN @{power_paths[1]}
${maximums}= Get Sensors Aggregation Data ${power_path}
${max} ${min}= Evaluate (max(@{maximums}), min(@{maximums}))
Should Be True ${max} < ${upper_power_limit}
... msg=Wattage ${max} crossed ${upper_power_limit}.
Should Be True ${min} >= ${lower_power_limit}
... msg=Wattage ${min} below ${lower_power_limit}.
END
# Every 30 seconds the power wattage data is updated.
Sleep ${power_data_collection_interval}s
Check Power Telemetry When Host Off
[Documentation] Check that power consumption is within limits when host
... is off.
[Arguments] ${power_paths}
# Description of argument(s):
# power_paths A list of power paths (example list element
# "/org/open_power/sensors/aggregation/per_30s/ps0_input_power/average").
# Every 30 seconds the power wattage data is updated.
Sleep ${power_data_collection_interval}s
# Check for "average" aggregation.
FOR ${power_path} IN @{power_paths[0]}
${averages}= Get Sensors Aggregation Data ${power_path}
Should Be True ${averages[0]} < ${lower_power_limit}
... msg=Wattage ${averages[0]} more than ${lower_power_limit}.
END
# Check for "maximum" aggregation.
FOR ${power_path} IN @{power_paths[1]}
${maximums}= Get Sensors Aggregation Data ${power_path}
Should Be True ${maximums[0]} < ${lower_power_limit}
... msg=Wattage ${maximums[0]} more than ${lower_power_limit}.
END
Reset 30s Aggregation Power Readings
[Documentation] Reset 30s Aggregation Power Readings to ensure readings
... are collected after Power Supplies are done powering up.
BMC Execute Command /bin/systemctl restart power-supply-monitor@0.service
BMC Execute Command /bin/systemctl restart power-supply-monitor@1.service
# wait for services to restart.
Sleep 10s
Set Power Supply Present
[Documentation] Clear error log and set power present field.
[Arguments] ${power_present_setting}
# Description of argument(s):
# power_present_setting Enable or disable power present field (e.g."0/1").
${data}= Create Dictionary data=${power_present_setting}
Write Attribute
... ${HOST_INVENTORY_URI}system/chassis/motherboard/powersupply0
... Present data=${data}