1*** Settings ***
2Documentation  Validate IPMI sensor IDs using Redfish.
3
4Resource          ../lib/ipmi_client.robot
5Resource          ../lib/openbmc_ffdc.robot
6
7Suite Setup       Redfish.Login
8Suite Teardown    Redfish.Logout
9Test Setup        Printn
10Test Teardown     FFDC On Test Case Fail
11
12
13*** Variables ***
14${allowed_temp_diff}    ${1}
15
16
17*** Test Cases ***
18
19Verify IPMI Temperature Readings using Redfish
20    [Documentation]  Verify temperatures from IPMI sensor reading command using Redfish.
21    [Tags]  Verify_IPMI_Temperature_Readings_using_Redfish
22    [Template]  Get Temperature Reading And Verify In Redfish
23
24    # command_type  sensor_id  member_id
25    IPMI            pcie       pcie
26    IPMI            ambient    ambient
27
28
29Verify DCMI Temperature Readings using Redfish
30    [Documentation]  Verify temperatures from DCMI sensor reading command using Redfish.
31    [Tags]  Verify_DCMI_Temperature_Readings_using_Redfish
32    [Template]  Get Temperature Reading And Verify In Redfish
33
34    # command_type  sensor_id  member_id
35    DCMI            pcie       pcie
36    DCMI            ambient    ambient
37
38
39Test Ambient Temperature Via IPMI
40    [Documentation]  Test ambient temperature via IPMI and verify using Redfish.
41    [Tags]  Test_Ambient_Temperature_Via_IPMI
42
43    # Example of IPMI dcmi get_temp_reading output:
44    #        Entity ID                       Entity Instance    Temp. Readings
45    # Inlet air temperature(40h)                      1               +19 C
46    # CPU temperature sensors(41h)                    5               +51 C
47    # CPU temperature sensors(41h)                    6               +50 C
48    # CPU temperature sensors(41h)                    7               +50 C
49    # CPU temperature sensors(41h)                    8               +50 C
50    # CPU temperature sensors(41h)                    9               +50 C
51    # CPU temperature sensors(41h)                    10              +48 C
52    # CPU temperature sensors(41h)                    11              +49 C
53    # CPU temperature sensors(41h)                    12              +47 C
54    # CPU temperature sensors(41h)                    8               +50 C
55    # CPU temperature sensors(41h)                    16              +51 C
56    # CPU temperature sensors(41h)                    24              +50 C
57    # CPU temperature sensors(41h)                    32              +43 C
58    # CPU temperature sensors(41h)                    40              +43 C
59    # Baseboard temperature sensors(42h)              1               +35 C
60
61    ${temp_reading}=  Run IPMI Standard Command  dcmi get_temp_reading -N 10
62    Should Contain  ${temp_reading}  Inlet air temperature
63    ...  msg="Unable to get inlet temperature via DCMI".
64
65    ${ambient_temp_line}=
66    ...  Get Lines Containing String  ${temp_reading}
67    ...  Inlet air temperature  case-insensitive
68
69    ${ambient_temp_ipmi}=  Set Variable  ${ambient_temp_line.split('+')[1].strip(' C')}
70
71    # Example of ambient temperature via Redfish
72
73    #"@odata.id": "/redfish/v1/Chassis/chassis/Thermal#/Temperatures/0",
74    #"@odata.type": "#Thermal.v1_3_0.Temperature",
75    #"LowerThresholdCritical": 0.0,
76    #"LowerThresholdNonCritical": 0.0,
77    #"MaxReadingRangeTemp": 0.0,
78    #"MemberId": "ambient",
79    #"MinReadingRangeTemp": 0.0,
80    #"Name": "ambient",
81    #"ReadingCelsius": 24.987000000000002,
82    #"Status": {
83          #"Health": "OK",
84          #"State": "Enabled"
85    #},
86    #"UpperThresholdCritical": 35.0,
87    #"UpperThresholdNonCritical": 25.0
88
89    ${ambient_temp_redfish}=  Get Temperature Reading From Redfish  ambient
90
91    ${ipmi_redfish_temp_diff}=
92    ...  Evaluate  abs(${ambient_temp_redfish} - ${ambient_temp_ipmi})
93
94    Should Be True  ${ipmi_redfish_temp_diff} <= ${allowed_temp_diff}
95    ...  msg=Ambient temperature above allowed threshold ${allowed_temp_diff}.
96
97
98*** Keywords ***
99
100Get Temperature Reading And Verify In Redfish
101    [Documentation]  Get IPMI or DCMI sensor reading and verify in Redfish.
102    [Arguments]  ${command_type}  ${sensor_id}  ${member_id}
103
104    # Description of argument(s):
105    # command_type  Type of command used to get sensor data (eg. IPMI, DCMI).
106    # sensor_id     Sensor id used to get reading in IPMI or DCMI.
107    # member_id     Member id of sensor data in Redfish.
108
109    ${ipmi_value}=  Run Keyword If  '${command_type}' == 'IPMI'  Get IPMI Sensor Reading  ${sensor_id}
110    ...  ELSE  Get DCMI Sensor Reading  ${sensor_id}
111
112    ${redfish_value}=  Get Temperature Reading From Redfish  ${member_id}
113
114    Valid Range  ${ipmi_value}  ${redfish_value-1.000}  ${redfish_value+1.000}
115
116
117Get IPMI Sensor Reading
118    [Documentation]  Get reading from IPMI sensor reading command.
119    [Arguments]  ${sensor_id}
120
121    # Description of argument(s):
122    # sensor_id     Sensor id used to get reading in IPMI.
123
124    ${data}=  Run IPMI Standard Command  sensor reading ${sensor_id}
125
126    # Example reading:
127    # pcie             | 28.500
128
129    ${sensor_value}=  Set Variable  ${data.split('| ')[1].strip()}
130    [Return]  ${sensor_value}
131
132
133Get DCMI Sensor Reading
134    [Documentation]  Get reading from DCMI sensors command.
135    [Arguments]  ${sensor_id}
136
137    # Description of argument(s):
138    # sensor_id     Sensor id used to get reading in DCMI.
139
140    ${data}=  Run IPMI Standard Command  dcmi sensors
141    ${sensor_data}=  Get Lines Containing String  ${data}  ${sensor_id}
142
143    # Example reading:
144    # Record ID 0x00fd: pcie             | 28.50 degrees C   | ok
145
146    ${sensor_value}=  Set Variable  ${sensor_data.split(' | ')[1].strip('degrees C').strip()}
147    [Return]  ${sensor_value}
148
149
150Get Temperature Reading From Redfish
151    [Documentation]  Get temperature reading from Redfish.
152    [Arguments]  ${member_id}
153
154    # Description of argument(s):
155    # member_id    Member id of temperature.
156
157    @{redfish_readings}=  Redfish.Get Attribute  /redfish/v1/Chassis/chassis/Thermal  Temperatures
158    FOR  ${data}  IN  @{redfish_readings}
159        ${redfish_value}=  Set Variable If  '&{data}[MemberId]' == '${member_id}'
160        ...  &{data}[ReadingCelsius]
161        Exit For Loop If  '&{data}[MemberId]' == '${member_id}'
162    END
163    [Return]  ${redfish_value}