1*** Settings ***
2
3Documentation       Test telemetry functionality of OpenBMC.
4
5Resource            ../../lib/bmc_redfish_resource.robot
6Resource            ../../lib/openbmc_ffdc.robot
7
8Suite Setup         Suite Setup Execution
9Suite Teardown      Redfish.Logout
10Test Setup          Delete All Telemetry Reports
11Test Teardown       Test Teardown Execution
12
13Force Tags          Telemetry_Report
14
15*** Variables ***
16
17${metric_definition_base_uri}  /redfish/v1/TelemetryService/MetricReportDefinitions
18${metric_report_base_uri}      /redfish/v1/TelemetryService/MetricReports
19&{user_tele_def}               ambient temperature=Ambient.*Temp    pcie temperature=PCIE.*Temp
20...                            processor temperature=proc.*temp    dimm temperature=dimm.*temp
21...                            battery voltage=Battery_Voltage    total power=total_power
22...                            relative humidity=Relative_Humidity
23
24
25*** Test Cases ***
26
27Verify Basic Telemetry Report Creation
28    [Documentation]  Verify basic telemetry report creations for different metrics.
29    [Tags]  Verify_Basic_Telemetry_Report_Creation
30    [Template]  Create Basic Telemetry Report
31
32    # Metric definition   Metric ReportDefinition Type    Report Actions        Append Limit  Expected Result
33    ambient temperature      OnRequest               LogToMetricReportsCollection
34    processor temperature    Periodic                LogToMetricReportsCollection      500
35    dimm temperature         Periodic                LogToMetricReportsCollection      1000
36    total power              OnRequest               LogToMetricReportsCollection
37    invalid value            OnRequest               LogToMetricReportsCollection      100             fail
38    relative humidity        OnRequest               LogToMetricReportsCollection
39    battery voltage          Periodic                LogToMetricReportsCollection      100
40
41
42Verify Error After Exceeding Maximum Report Creation
43    [Documentation]  Verify error while creating telemetry report more than max report limit.
44    [Tags]  Verify_Error_After_Exceeding_Maximum_Report_Creation
45
46    ${report_name}=  Set Variable  Testreport
47
48    # Create maximum number of reports.
49    ${resp}=  Redfish.Get Properties  /redfish/v1/TelemetryService
50    FOR  ${i}  IN RANGE  ${resp["MaxReports"]}
51        Create Basic Telemetry Report   total power  Periodic  LogToMetricReportsCollection
52    END
53
54    # Attempt another report creation and it should fail.
55    Create Basic Telemetry Report
56    ...   total power  Periodic  LogToMetricReportsCollection  expected_result=fail
57
58    # Now delete the reports created.
59    Delete All Telemetry Reports
60
61
62Verify Basic Telemetry Report Creation For PCIE
63     [Documentation]  Verify basic telemetry report creations for PCIE.
64     [Tags]  Verify_Basic_Telemetry_Report_Creation_For_PCIE
65
66     Create Basic Telemetry Report
67     ...  pcie temperature  OnRequest  LogToMetricReportsCollection
68
69
70*** Keywords ***
71
72Suite Setup Execution
73    [Documentation]  Do test case setup tasks.
74
75    Redfish.Login
76    Redfish Power On  stack_mode=skip
77    ${metric_definitions_list}=
78    ...  Redfish_Utils.Get Member List  /redfish/v1/TelemetryService/MetricDefinitions
79
80    # Create a dictionary of ordinary english naming and actual naming of
81    # telemtry definition.
82    ${english_actual_teleDef}=   Create Dictionary
83
84    Set Suite Variable  ${english_actual_teleDef}
85    Set Suite Variable  ${metric_definitions_list}
86
87    Set To Dictionary  ${english_actual_teleDef}  invalid value  invalid_value
88
89    # Find and collect actual telemetry definitions.
90    FOR    ${key}  IN  @{user_tele_def.keys()}
91      Add To Telemetry definition Record   ${key}   ${user_tele_def['${key}']}
92    END
93
94
95Add To Telemetry definition Record
96    [Documentation]  Find actual telemetry definitions available and store.
97    ...              Definitions are stored in a dictionary as key and value
98    ...              as described in argument documentation.
99    [Arguments]  ${key}  ${value}
100
101    # Description of argument(s):
102    # key       Name of metric definition in plain english.
103    #           Example: ambient temperature
104    # value     Equivalent regex expression of telemetry definition.
105    #           Example:  Ambient.*Temp
106
107    FOR  ${item}  IN  @{metric_definitions_list}
108      ${regex_matching_output}=  Get Regexp Matches  ${item}  ${value}
109      IF  ${regex_matching_output} != []
110          Set To Dictionary  ${english_actual_teleDef}  ${key}=${regex_matching_output}[0]
111          Exit For Loop
112      END
113    END
114
115
116Test Teardown Execution
117    [Documentation]  Do test teardown operation.
118
119    FFDC On Test Case Fail
120    Delete All Telemetry Reports
121
122
123Create Basic Telemetry Report
124    [Documentation]  Create a basic telemetry report with single metric.
125    [Arguments]  ${metric_definition_name}  ${metric_definition_type}
126    ...  ${report_action}  ${append_limit}=10  ${expected_result}=success
127
128    # Description of argument(s):
129    # metric_definition_name    Name of metric definition like Ambient_0_Temp.
130    # metric_definition_type    Name of telemetry report which needs to be created.
131    # report_action             Telemetry report action.
132    # append_limit              Append limit of the metric data in the report.
133    # expected_result           Expected result of report creation - success or fail.
134
135    ${metric_definition_name}=  Set Variable  ${english_actual_teleDef}[${metric_definition_name}]
136    ${resp}=  Redfish.Get Properties
137    ...  /redfish/v1/TelemetryService/MetricDefinitions/${metric_definition_name}
138    ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NOT_FOUND}]
139    ${telemetry_data_unavailable}=  Run Keyword And Return Status  Should Contain  ${resp}  error
140    IF  ${telemetry_data_unavailable} == ${True}
141        ${metricProperties}=  Set Variable  ""
142    ELSE
143        ${metricProperties}=  Set Variable  ${resp["MetricProperties"]}
144    END
145    # Example of response from above Redfish GET request.
146    # "@odata.id": "/redfish/v1/TelemetryService/MetricDefinitions/Ambient_0_Temp",
147    # "@odata.type": "#MetricDefinition.v1_0_3.MetricDefinition",
148    # "Id": "Ambient_0_Temp",
149    # "IsLinear": true,
150    # "MaxReadingRange": 127.0,
151    # "MetricDataType": "Decimal",
152    # "MetricProperties": [
153    #     "/redfish/v1/Chassis/chassis/Sensors/temperature_Ambient_0_Temp"
154    # ],
155    # "MetricType": "Gauge",
156    # "MinReadingRange": -128.0,
157    # "Name": "Ambient_0_Temp",
158    # "Units": "Cel"
159
160    # Report name is from random generated string with length 16 which
161    # is enough to maintain uniqueness in report name.
162    ${report_name}=  Generate Random String  16  [NUMBERS]abcdef
163    ${body}=  Catenate  {"Id": "${report_name}",
164    ...  "MetricReportDefinitionType": "${metric_definition_type}",
165    ...  "Name": "Report",
166    ...  "ReportActions":["${report_action}"],
167    ...  "Metrics":[{"CollectionDuration": "PT30.000S",
168    ...  "MetricProperties":${metricProperties}}],
169    ...  "ReportUpdates": "AppendWrapsWhenFull",
170    ...  "AppendLimit": ${append_limit},
171    ...  "Schedule": {"RecurrenceInterval": "PT5.000S"}}
172
173    ${body}=  Replace String  ${body}  '  "
174    ${dict}  Evaluate  json.loads('''${body}''')  json
175
176    ${status_code_expected}=  Set Variable If
177    ...  '${expected_result}' == 'success'  [${HTTP_CREATED}]
178    ...  '${expected_result}' == 'fail'  [${HTTP_BAD_REQUEST}]
179
180    Redfish.Post  ${metric_definition_base_uri}  body=&{dict}
181     ...  valid_status_codes=${status_code_expected}
182
183    IF  '${expected_result}' == 'success'
184        # Verify definition of report has attributes provided at the time of creation.
185        ${resp_report}=  Redfish.Get  ${metric_definition_base_uri}/${report_name}
186        ...  valid_status_codes=[${HTTP_OK}]
187        Should Be True  '${resp_report.dict["MetricReportDefinitionType"]}' == '${metric_definition_type}'
188        Should Be True  '${resp_report.dict["AppendLimit"]}' == '${AppendLimit}'
189        Should Be True  '${resp_report.dict["ReportActions"][0]}' == '${report_action}'
190        Should Be True
191        ...  '${resp_report.dict["Metrics"]}[0][MetricProperties][0]' == '${resp["MetricProperties"][0]}'
192    END
193
194
195Delete All Telemetry Reports
196    [Documentation]  Delete all existing telemetry reports.
197
198    ${report_list}=  Redfish_Utils.Get Member List  /redfish/v1/TelemetryService/MetricReportDefinitions
199    FOR  ${report}  IN  @{report_list}
200      Redfish.Delete  ${report}  valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}]
201    END
202