added support of device-management-interface==0.9.6
Change-Id: I97ad91366d38a4c60c6edd0508438a101424b4e1
diff --git a/libraries/grpc-robot/tests/servers/dmi/dmi_server.py b/libraries/grpc-robot/tests/servers/dmi/dmi_server.py
new file mode 100644
index 0000000..3f86e39
--- /dev/null
+++ b/libraries/grpc-robot/tests/servers/dmi/dmi_server.py
@@ -0,0 +1,130 @@
+# Copyright 2020 ADTRAN, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+from concurrent import futures
+import grpc
+
+import dmi.hw_events_mgmt_service_pb2
+import dmi.hw_events_mgmt_service_pb2_grpc
+import dmi.hw_management_service_pb2
+import dmi.hw_management_service_pb2_grpc
+import dmi.hw_metrics_mgmt_service_pb2
+import dmi.hw_metrics_mgmt_service_pb2_grpc
+import dmi.sw_management_service_pb2
+import dmi.sw_management_service_pb2_grpc
+import dmi.commons_pb2
+import dmi.sw_image_pb2
+
+
+class DmiEventsManagementServiceServicer(dmi.hw_events_mgmt_service_pb2_grpc.NativeEventsManagementServiceServicer):
+
+ def ListEvents(self, request, context):
+ return dmi.hw_events_mgmt_service_pb2.ListEventsResponse(status=dmi.commons_pb2.OK_STATUS)
+
+ def UpdateEventsConfiguration(self, request, context):
+ return dmi.hw_events_mgmt_service_pb2.EventsConfigurationResponse(status=dmi.commons_pb2.OK_STATUS)
+
+
+class DmiHwManagementServiceServicer(dmi.hw_management_service_pb2_grpc.NativeHWManagementServiceServicer):
+
+ def StartManagingDevice(self, request, context):
+ for _ in range(0, 1):
+ yield dmi.hw_management_service_pb2.StartManagingDeviceResponse(status=dmi.commons_pb2.OK_STATUS)
+
+ def StopManagingDevice(self, request, context):
+ return dmi.hw_management_service_pb2.StopManagingDeviceResponse(status=dmi.commons_pb2.OK_STATUS)
+
+ def GetManagedDevices(self, request, context):
+ return dmi.hw_management_service_pb2.ManagedDevicesResponse()
+
+ def GetPhysicalInventory(self, request, context):
+ for _ in range(0, 1):
+ yield dmi.hw_management_service_pb2.PhysicalInventoryResponse(status=dmi.commons_pb2.OK_STATUS)
+
+ def GetHWComponentInfo(self, request, context):
+ for _ in range(0, 1):
+ yield dmi.hw_management_service_pb2.HWComponentInfoGetResponse(status=dmi.commons_pb2.OK_STATUS)
+
+ def SetHWComponentInfo(self, request, context):
+ return dmi.hw_management_service_pb2.HWComponentInfoSetResponse(status=dmi.commons_pb2.OK_STATUS)
+
+ def SetLoggingEndpoint(self, request, context):
+ return dmi.hw_management_service_pb2.SetRemoteEndpointResponse(status=dmi.commons_pb2.OK_STATUS)
+
+ def GetLoggingEndpoint(self, request, context):
+ return dmi.hw_management_service_pb2.GetLoggingEndpointResponse(status=dmi.commons_pb2.OK_STATUS)
+
+ def SetMsgBusEndpoint(self, request, context):
+ return dmi.hw_management_service_pb2.SetRemoteEndpointResponse(status=dmi.commons_pb2.OK_STATUS)
+
+ def GetMsgBusEndpoint(self, request, context):
+ return dmi.hw_management_service_pb2.GetMsgBusEndpointResponse(status=dmi.commons_pb2.OK_STATUS)
+
+ def GetLoggableEntities(self, request, context):
+ return dmi.hw_management_service_pb2.GetLogLevelResponse(status=dmi.commons_pb2.OK_STATUS)
+
+ def SetLogLevel(self, request, context):
+ return dmi.hw_management_service_pb2.SetLogLevelResponse()
+
+ def GetLogLevel(self, request, context):
+ return dmi.hw_management_service_pb2.GetLogLevelResponse(status=dmi.commons_pb2.OK_STATUS)
+
+
+class DmiMetricsManagementServiceServicer(dmi.hw_metrics_mgmt_service_pb2_grpc.NativeMetricsManagementServiceServicer):
+
+ def ListMetrics(self, request, context):
+ return dmi.hw_metrics_mgmt_service_pb2.ListMetricsResponse(status=dmi.commons_pb2.OK_STATUS)
+
+ def UpdateMetricsConfiguration(self, request, context):
+ return dmi.hw_metrics_mgmt_service_pb2.MetricsConfigurationResponse(status=dmi.commons_pb2.OK_STATUS)
+
+ def GetMetric(self, request, context):
+ return dmi.hw_metrics_mgmt_service_pb2.GetMetricResponse(status=dmi.commons_pb2.OK_STATUS)
+
+
+class DmiSoftwareManagementServiceServicer(dmi.sw_management_service_pb2_grpc.NativeSoftwareManagementServiceServicer):
+
+ def GetSoftwareVersion(self, request, context):
+ return dmi.sw_management_service_pb2.GetSoftwareVersionInformationResponse(status=dmi.commons_pb2.OK_STATUS)
+
+ def DownloadImage(self, request, context):
+ for _ in range(0, 1):
+ yield dmi.sw_image_pb2.ImageStatus(status=dmi.commons_pb2.OK_STATUS)
+
+ def ActivateImage(self, request, context):
+ for _ in range(0, 1):
+ yield dmi.sw_image_pb2.ImageStatus(status=dmi.commons_pb2.OK_STATUS)
+
+ def RevertToStandbyImage(self, request, context):
+ for _ in range(0, 1):
+ yield dmi.sw_image_pb2.ImageStatus(status=dmi.commons_pb2.OK_STATUS)
+
+ def UpdateStartupConfiguration(self, request, context):
+ for _ in range(0, 1):
+ yield dmi.sw_management_service_pb2.ConfigResponse(status=dmi.commons_pb2.OK_STATUS)
+
+
+def serve():
+ server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
+
+ dmi.hw_events_mgmt_service_pb2_grpc.add_NativeEventsManagementServiceServicer_to_server(DmiEventsManagementServiceServicer(), server)
+ dmi.hw_management_service_pb2_grpc.add_NativeHWManagementServiceServicer_to_server(DmiHwManagementServiceServicer(), server)
+ dmi.hw_metrics_mgmt_service_pb2_grpc.add_NativeMetricsManagementServiceServicer_to_server(DmiMetricsManagementServiceServicer(), server)
+ dmi.sw_management_service_pb2_grpc.add_NativeSoftwareManagementServiceServicer_to_server(DmiSoftwareManagementServiceServicer(), server)
+
+ server.add_insecure_port('127.0.01:50051')
+ server.start()
+ server.wait_for_termination()
+
+
+if __name__ == '__main__':
+ serve()
diff --git a/libraries/grpc-robot/tests/test.robot b/libraries/grpc-robot/tests/test.robot
new file mode 100644
index 0000000..27b9204
--- /dev/null
+++ b/libraries/grpc-robot/tests/test.robot
@@ -0,0 +1,151 @@
+# Copyright 2020 ADTRAN, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+
+*** Settings ***
+Documentation Library test suite for the grpc_robot library. To run the test suite, the fake device manager from
+... _./servers/dmi_ must have been started beforehand with command _python3 dmi_server.py_.
+Library OperatingSystem WITH NAME os
+Library String
+Library Collections
+Variables ./variables.py
+
+*** Test Cases ***
+Library import
+ [Documentation] Checks if the grpc_robot libraries can be imported.
+ Import Library grpc_robot.Dmi WITH NAME dmi
+ Import Library grpc_robot.Collections
+ Import Library grpc_robot.DmiTools WITH NAME tools
+
+library_versions
+ [Documentation] Checks if the library returns the installed library and device-management-interface versions.
+ [Template] version_check
+ grpc-robot dmi.Library Version Get
+ device-management-interface dmi.Dmi Version Get
+
+keywords
+ [Documentation] Checks if the keyword name exists in the library's keyword list.
+ Keyword Should Exist dmi.connection_close
+ Keyword Should Exist dmi.connection_open
+ Keyword Should Exist dmi.connection_parameters_get
+ Keyword Should Exist dmi.connection_parameters_set
+ Keyword Should Exist dmi.hw_event_mgmt_service_list_events
+ Keyword Should Exist dmi.hw_event_mgmt_service_update_events_configuration
+ Keyword Should Exist dmi.hw_management_service_get_hw_component_info
+ Keyword Should Exist dmi.hw_management_service_get_logging_endpoint
+ Keyword Should Exist dmi.hw_management_service_get_managed_devices
+ Keyword Should Exist dmi.hw_management_service_get_msg_bus_endpoint
+ Keyword Should Exist dmi.hw_management_service_get_physical_inventory
+ Keyword Should Exist dmi.hw_management_service_set_hw_component_info
+ Keyword Should Exist dmi.hw_management_service_set_logging_endpoint
+ Keyword Should Exist dmi.hw_management_service_set_msg_bus_endpoint
+ Keyword Should Exist dmi.hw_management_service_start_managing_device
+ Keyword Should Exist dmi.hw_management_service_stop_managing_device
+ Keyword Should Exist dmi.hw_management_service_get_loggable_entities
+ Keyword Should Exist dmi.hw_management_service_set_log_level
+ Keyword Should Exist dmi.hw_management_service_get_log_level
+ Keyword Should Exist dmi.hw_metrics_mgmt_service_get_metric
+ Keyword Should Exist dmi.hw_metrics_mgmt_service_list_metrics
+ Keyword Should Exist dmi.hw_metrics_mgmt_service_update_metrics_configuration
+ Keyword Should Exist dmi.sw_management_service_activate_image
+ Keyword Should Exist dmi.sw_management_service_download_image
+ Keyword Should Exist dmi.sw_management_service_revert_to_standby_image
+ Keyword Should Exist dmi.sw_management_service_get_software_version
+ Keyword Should Exist tools.hw_metrics_mgmt_decode_metric
+ Keyword Should Exist tools.hw_events_mgmt_decode_event
+
+dmi
+ [Documentation] Checks the RPC keywords whether or not they handle their input and output correctly and uses the
+ ... fake device manager for that. The fake device manager returns _OK_STATUS_ for each RPC. The variables
+ ... _${keywords_to_skip}_ and _${params}_ are defined in the variables file _./variables.py_.
+ [Setup] dmi.Connection Open host=127.0.0.1 port=50051
+ ${keywords} Run Keyword dmi.Get Keyword Names
+ FOR ${keyword} IN @{keywords}
+ Continue For Loop If '${keyword}' in ${keywords_to_skip}
+ ${status} ${params} Run Keyword And Ignore Error Get From Dictionary ${param_dicts} ${keyword}
+ Run Keyword If '${status}' == 'FAIL' Log no parameters available for keyword '${keyword}' WARN
+ Continue For Loop If '${status}' == 'FAIL'
+ Run Keyword If ${params} == ${NONE} ${keyword} ELSE ${keyword} ${params}
+ END
+ [Teardown] dmi.Connection Close
+
+connection_params
+ [Documentation] Checks the connection parameter settings.
+ ${new_timeout} Set Variable 100
+ ${settings_before} dmi.Connection Parameters Get
+ ${settings_while_set} dmi.Connection Parameters Set timeout=${new_timeout}
+ ${settings_after} dmi.Connection Parameters Get
+ Should Be Equal ${settings_before} ${settings_while_set}
+ Should Be Equal As Integers ${settings_after}[timeout] ${new_timeout}
+
+enum_and_default_values
+ [Documentation] Checks the optional parameters _return_enum_integer_ and _return_defaults_ of the RPC keywords to
+ ... control their output. Check keyword documentation for the meaning of the parameters.
+ ... *Note*: The fake device manager must be running for this test case.
+ [Setup] dmi.Connection Open host=127.0.0.1 port=50051
+ ${params} Get From Dictionary ${param_dicts} hw_management_service_get_log_level
+ ${return} hw_management_service_get_log_level ${params}
+ Should Be Equal As Strings ${return}[status] OK_STATUS
+ Dictionary Should Not Contain Key ${return} reason
+ ${return} hw_management_service_get_log_level ${params} return_enum_integer=true
+ Should Be Equal As Integers ${return}[status] 1
+ Dictionary Should Not Contain Key ${return} reason
+ ${return} hw_management_service_get_log_level ${params} return_enum_integer=${TRUE}
+ Should Be Equal As Integers ${return}[status] 1
+ Dictionary Should Not Contain Key ${return} reason
+ ${return} hw_management_service_get_log_level ${params} return_defaults=true
+ Should Be Equal As Strings ${return}[status] OK_STATUS
+ Should Be Equal As Strings ${return}[reason] UNDEFINED_REASON
+ ${return} hw_management_service_get_log_level ${params} return_defaults=${TRUE}
+ Should Be Equal As Strings ${return}[status] OK_STATUS
+ Should Be Equal As Strings ${return}[reason] UNDEFINED_REASON
+ ${return} hw_management_service_get_log_level ${params} return_enum_integer=true return_defaults=true
+ Should Be Equal As Integers ${return}[status] 1
+ Should Be Equal As Integers ${return}[reason] 0
+ [Teardown] dmi.Connection Close
+
+tools
+ [Documentation] Checks some functions from the tools library which shall support the tester with general functionality.
+ ${dict_1} Create Dictionary name=abc type=123
+ ${dict_2} Create Dictionary name=def type=456
+ ${list} Create List ${dict_1} ${dict_2}
+ ${return_dict} grpc_robot.Collections.List Get Dict By Value ${list} name def
+ Should Be Equal ${return_dict}[type] 456
+
+dmi_tools
+ [Documentation] Checks functions from the DMI tools library with decoding Kafka messages. The variables
+ ... _kafka_metric_messages_ and _kafka_event_messages_ is defined in the variables file.
+ FOR ${kafka} IN @{kafka_metric_messages}
+ ${metric} tools.Hw Metrics Mgmt Decode Metric ${kafka}[message]
+ Should Be Equal ${metric}[metric_metadata][device_uuid][uuid] 4c411df2-22e6-58d2-b1bb-545a0263d18d
+ Should Be Equal ${metric}[metric_id] ${kafka}[metric]
+ END
+ FOR ${kafka} IN @{kafka_event_messages}
+ ${event} tools.Hw Events Mgmt Decode Event ${kafka}[message]
+ Should Be Equal ${event}[event_metadata][device_uuid][uuid] 84f46fde-89fa-5a2f-be4a-6d18abe6e953
+ Should Be Equal ${event}[event_id] ${kafka}[event]
+ END
+
+*** Keywords ***
+version_check
+ [Documentation] Determines the version of the installed package and compares it with the returned version of the
+ ... corresponding keyword.
+ [Arguments] ${package_name} ${kw_name}
+ ${pip show} os.Run python3 -m pip show ${package_name} | grep Version
+ ${pip show} Split To Lines ${pip show}
+ FOR ${line} IN @{pip show}
+ ${is_version} Evaluate '${line}'.startswith('Version')
+ Continue For Loop If not ${is_version}
+ ${pip_version} Evaluate '${line}'.split(':')[-1].strip()
+ END
+ ${lib_version} Run Keyword ${kw_name}
+ Should Be Equal ${pip_version} ${lib_version}
diff --git a/libraries/grpc-robot/tests/variables.py b/libraries/grpc-robot/tests/variables.py
new file mode 100644
index 0000000..30d5afd
--- /dev/null
+++ b/libraries/grpc-robot/tests/variables.py
@@ -0,0 +1,140 @@
+# Copyright 2020 ADTRAN, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+
+keywords_to_skip = [
+ 'connection_open',
+ 'connection_close',
+ 'connection_parameters_get',
+ 'connection_parameters_set',
+ 'get_keyword_names',
+ 'library_version_get',
+ 'dmi_version_get'
+]
+
+param_dicts = {
+ 'hw_event_mgmt_service_list_events': {'uuid': {'uuid': '1234-3456-5678'}},
+ 'hw_event_mgmt_service_update_events_configuration': {'device_uuid': {'uuid': '1234-3456-5678'}},
+ 'hw_management_service_start_managing_device': {'name': 'otti', 'uri': {'uri': '1.2.3.4'}},
+ 'hw_management_service_stop_managing_device': {'name': 'otti'},
+ 'hw_management_service_get_managed_devices': None,
+ 'hw_management_service_get_physical_inventory': {'device_uuid': {'uuid': '1234-3456-5678'}},
+ 'hw_management_service_get_hw_component_info': {'device_uuid': {'uuid': '1234-3456-5678'}},
+ 'hw_management_service_set_hw_component_info': {'device_uuid': {'uuid': '1234-3456-5678'}},
+ 'hw_management_service_set_logging_endpoint': {'device_uuid': {'uuid': '1234-3456-5678'}},
+ 'hw_management_service_get_logging_endpoint': {'uuid': {'uuid': '1234-3456-5678'}},
+ 'hw_management_service_set_msg_bus_endpoint': {'msgbus_endpoint': '1234-3456-5678'},
+ 'hw_management_service_get_msg_bus_endpoint': None,
+ 'hw_management_service_get_loggable_entities': {'device_uuid': {'uuid': '1234-3456-5678'}},
+ 'hw_management_service_set_log_level': {'device_uuid': {'uuid': '1234-3456-5678'}},
+ 'hw_management_service_get_log_level': {'device_uuid': {'uuid': '1234-3456-5678'}},
+ 'hw_metrics_mgmt_service_list_metrics': {'uuid': {'uuid': '1234-3456-5678'}},
+ 'hw_metrics_mgmt_service_update_metrics_configuration': {'device_uuid': {'uuid': '1234-3456-5678'}},
+ 'hw_metrics_mgmt_service_get_metric': {'meta_data': {'device_uuid': {'uuid': '1234-3456-5678'}}},
+ 'sw_management_service_get_software_version': {'uuid': {'uuid': '1234-3456-5678'}},
+ 'sw_management_service_download_image': {'device_uuid': {'uuid': '1234-3456-5678'}},
+ 'sw_management_service_activate_image': {'uuid': {'uuid': '1234-3456-5678'}},
+ 'sw_management_service_revert_to_standby_image': {'uuid': {'uuid': '1234-3456-5678'}},
+ 'sw_management_service_update_startup_configuration': {'device_uuid': {'uuid': '1234-3456-5678'}},
+}
+
+kafka_metric_messages = [
+ {
+ 'message': b"\x08e\x12Y\n&\n$4c411df2-22e6-58d2-b1bb-545a0263d18d\x12&\n$96f716bd-9e72-5c39-9a79-58bb3821df19\x1a\x07cpu 0/1\x1a9\x08\x07\x10\x01\x18\t(\x012\x07percent:\x06\x08\xde\x96\x84\xfd\x05@\x88'J\x1bMETRIC_CPU_USAGE_PERCENTAGE",
+ 'metric': 'METRIC_CPU_USAGE_PERCENTAGE'
+ },
+ {
+ 'message': b"\x08\xaf\x02\x12f\n&\n$4c411df2-22e6-58d2-b1bb-545a0263d18d\x12&\n$f14853c0-51e8-5f5a-8983-e8dc9c060f5d\x1a\x14storage-resource 0/1\x1a:\x08_\x10\x01\x18\t(\x012\x07percent:\x06\x08\xe3\x96\x84\xfd\x05@\x88'J\x1cMETRIC_DISK_USAGE_PERCENTAGE",
+ 'metric': 'METRIC_DISK_USAGE_PERCENTAGE'
+ },
+ {
+ 'message': b"\x08\xf6\x03\x12b\n&\n$4c411df2-22e6-58d2-b1bb-545a0263d18d\x12&\n$81ba5a6b-b8b9-582e-9cea-a512ed6bd8ad\x1a\x10power-supply 0/1\x1a;\x082\x10\x01\x18\t(\x012\x07percent:\x06\x08\xe7\x96\x84\xfd\x05@\x88'J\x1dMETRIC_POWER_USAGE_PERCENTAGE",
+ 'metric': 'METRIC_POWER_USAGE_PERCENTAGE'
+ },
+ {
+ 'message': b"\x08\xf6\x03\x12b\n&\n$4c411df2-22e6-58d2-b1bb-545a0263d18d\x12&\n$760d33cd-ad0d-541b-8014-272af0cfbff8\x1a\x10power-supply 0/2\x1a;\x082\x10\x01\x18\t(\x012\x07percent:\x06\x08\xe7\x96\x84\xfd\x05@\x88'J\x1dMETRIC_POWER_USAGE_PERCENTAGE",
+ 'metric': 'METRIC_POWER_USAGE_PERCENTAGE'
+ },
+ {
+ 'message': b"\x08\x01\x12e\n&\n$4c411df2-22e6-58d2-b1bb-545a0263d18d\x12&\n$0f3a8a29-2b79-560a-a034-2255e0c85920\x1a\x13pluggable-fan 0/1/1\x1a+\x08\xc0%\x10\n\x18\t(\x012\x03rpm:\x06\x08\xeb\x96\x84\xfd\x05@\x88'J\x10METRIC_FAN_SPEED",
+ 'metric': 'METRIC_FAN_SPEED'
+ },
+ {
+ 'message': b"\x08\x01\x12e\n&\n$4c411df2-22e6-58d2-b1bb-545a0263d18d\x12&\n$80d0e158-efc0-59ea-808d-e273d1c46099\x1a\x13pluggable-fan 0/1/2\x1a+\x08\xe5&\x10\n\x18\t(\x012\x03rpm:\x06\x08\xeb\x96\x84\xfd\x05@\x88'J\x10METRIC_FAN_SPEED",
+ 'metric': 'METRIC_FAN_SPEED'
+ },
+ {
+ 'message': b"\x08\x01\x12e\n&\n$4c411df2-22e6-58d2-b1bb-545a0263d18d\x12&\n$15d3103a-36b2-5774-ae06-d2d59a2ab6e7\x1a\x13pluggable-fan 0/1/3\x1a+\x08\xc8$\x10\n\x18\t(\x012\x03rpm:\x06\x08\xeb\x96\x84\xfd\x05@\x88'J\x10METRIC_FAN_SPEED",
+ 'metric': 'METRIC_FAN_SPEED'
+ },
+ {
+ 'message': b"\x08\xd8\x04\x12a\n&\n$4c411df2-22e6-58d2-b1bb-545a0263d18d\x12&\n$dc8c95f1-6b84-5e6d-b645-c76b02b7551b\x1a\x0ftemperature 0/1\x1aB\x085\x10\x08\x18\t(\x012\x0edegree Celsius:\x06\x08\xf0\x96\x84\xfd\x05@\x88'J\x1dMETRIC_INNER_SURROUNDING_TEMP",
+ 'metric': 'METRIC_INNER_SURROUNDING_TEMP'
+ },
+]
+
+kafka_event_messages = [
+ {
+ 'message': b'\na\n&\n$84f46fde-89fa-5a2f-be4a-6d18abe6e953\x12&\n$368c6f41-564c-5821-8e15-721f818387fc\x1a\x0f'
+ b'temperature 0/1\x10\xf7\x03\x1a\x06\x08\x80\x82\xcd\xfe\x05"\x10\n\x02\x10\x00\x12\n\n\x08\n\x02'
+ b'\x10A\x12\x02\x10\x01',
+ 'event': 'EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL_RECOVERED'
+ },
+ {
+ 'message': b'\na\n&\n$84f46fde-89fa-5a2f-be4a-6d18abe6e953\x12&\n$368c6f41-564c-5821-8e15-721f818387fc\x1a\x0f'
+ b'temperature 0/1\x10\xf8\x03\x1a\x06\x08\x80\x82\xcd\xfe\x05"\x00',
+ 'event': 'EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL_RECOVERED'
+ },
+ {
+ 'message': b'\na\n&\n$84f46fde-89fa-5a2f-be4a-6d18abe6e953\x12&\n$368c6f41-564c-5821-8e15-721f818387fc\x1a\x0f'
+ b'temperature 0/1\x10\xf5\x03\x1a\x06\x08\xfe\xac\xdd\xfe\x05"\x10\n\x02\x10\x03\x12\n\n\x08\n\x02'
+ b'\x10\x02\x12\x02\x10\x01*\xcf\x01The system temperature of the physical entity '
+ b'\'temperature 0/1\' has risen above power reduction active-threshold of 2 degree Celsius. Unit '
+ b'operates out of specification. Correct service cannot be guaranteed.',
+ 'event': 'EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL'
+ },
+ {
+ 'message': b'\na\n&\n$84f46fde-89fa-5a2f-be4a-6d18abe6e953\x12&\n$368c6f41-564c-5821-8e15-721f818387fc\x1a\x0f'
+ b'temperature 0/1\x10\xf6\x03\x1a\x06\x08\xfe\xac\xdd\xfe\x05"\x00*\x86\x01The system temperature '
+ b'of the physical entity \'temperature 0/1\' has risen above thermal shutdown active-threshold '
+ b'of 2 degree Celsius.',
+ 'event': 'EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL'
+ },
+ {
+ 'message': b'\na\n&\n$84f46fde-89fa-5a2f-be4a-6d18abe6e953\x12&\n$368c6f41-564c-5821-8e15-721f818387fc\x1a\x0f'
+ b'temperature 0/1\x10\xf7\x03\x1a\x06\x08\xfe\xac\xdd\xfe\x05"\x10\n\x02\x10\x00\x12\n\n\x08\n\x02'
+ b'\x10\x02\x12\x02\x10\x01',
+ 'event': 'EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL_RECOVERED'
+ },
+ {
+ 'message': b'\na\n&\n$84f46fde-89fa-5a2f-be4a-6d18abe6e953\x12&\n$368c6f41-564c-5821-8e15-721f818387fc\x1a\x0f'
+ b'temperature 0/1\x10\xf5\x03\x1a\x06\x08\xfe\xac\xdd\xfe\x05"\x10\n\x02\x10\x03\x12\n\n\x08\n\x02'
+ b'\x10\x02\x12\x02\x10\x01*\xcf\x01The system temperature of the physical entity '
+ b'\'temperature 0/1\' has risen above power reduction active-threshold of 2 degree Celsius. Unit '
+ b'operates out of specification. Correct service cannot be guaranteed.',
+ 'event': 'EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL'
+ },
+ {
+ 'message': b'\na\n&\n$84f46fde-89fa-5a2f-be4a-6d18abe6e953\x12&\n$368c6f41-564c-5821-8e15-721f818387fc\x1a\x0f'
+ b'temperature 0/1\x10\xf7\x03\x1a\x06\x08\xfe\xac\xdd\xfe\x05"\x10\n\x02\x10\x00\x12\n\n\x08\n\x02'
+ b'\x10\x02\x12\x02\x10\x01',
+ 'event': 'EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL_RECOVERED'
+ },
+ {
+ 'message': b'\na\n&\n$84f46fde-89fa-5a2f-be4a-6d18abe6e953\x12&\n$368c6f41-564c-5821-8e15-721f818387fc\x1a\x0f'
+ b'temperature 0/1\x10\xf5\x03\x1a\x06\x08\xfe\xac\xdd\xfe\x05"\x10\n\x02\x10\x03\x12\n\n\x08\n\x02'
+ b'\x10\x02\x12\x02\x10\x01*\xcf\x01The system temperature of the physical entity '
+ b'\'temperature 0/1\' has risen above power reduction active-threshold of 2 degree Celsius. Unit '
+ b'operates out of specification. Correct service cannot be guaranteed.',
+ 'event': 'EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL'
+ },
+]