DCMI: Get DCMI Temperature Reading

    - Created new script for DCMI Get Temperature reading command.

Tested:
    - Ran All The Scripts Successfully

Change-Id: I9a7c1cfa842494e47276d39f674da640c994eb05
Signed-off-by: ganesanb <ganesanb@ami.com>
diff --git a/data/dcmi_raw_cmd_table.py b/data/dcmi_raw_cmd_table.py
index 93d5fd8..6eab91a 100644
--- a/data/dcmi_raw_cmd_table.py
+++ b/data/dcmi_raw_cmd_table.py
@@ -14,5 +14,12 @@
             "GET": "0x2c 0x09 0xdc 0x00 0x10",
             "SET": "0x2c 0x0a 0xdc 0x00",
         },
+        "GET_TEMPERATURE_READING": [
+            # raw command, inlet temp entity ID, CPU temp entity ID, Baseboard temp entity ID
+            "0x2c 0x10 0xdc 0x01",
+            "0x40",
+            "0x41",
+            "0x42",
+        ],
     },
 }
diff --git a/ipmi/dcmi/test_dcmi_get_temperature_reading.robot b/ipmi/dcmi/test_dcmi_get_temperature_reading.robot
new file mode 100644
index 0000000..a27d188
--- /dev/null
+++ b/ipmi/dcmi/test_dcmi_get_temperature_reading.robot
@@ -0,0 +1,188 @@
+*** Settings ***
+
+Documentation    Module to test dcmi get temperature reading functionality.
+Resource         ../../lib/ipmi_client.robot
+Resource         ../../lib/openbmc_ffdc.robot
+Resource         ../../lib/bmc_network_utils.robot
+Resource         ../../lib/boot_utils.robot
+Variables        ../../data/ipmi_raw_cmd_table.py
+Variables        ../../data/dcmi_raw_cmd_table.py
+Variables        ../../data/ipmi_variable.py
+Library          ../../lib/bmc_network_utils.py
+Library          ../../lib/ipmi_utils.py
+Library          ../../lib/utilities.py
+Library          JSONLibrary
+
+Suite Setup  Suite Setup Execution
+
+*** Variables ***
+${config_file_name}             dcmi_sensors.json
+${dcmi_sensors_info_json_file}  /usr/share/ipmi-providers/${config_file_name}
+${client_config_file_path}      ${EXEC_DIR}/${config_file_name}
+&{dcmi_sensor_uri}
+
+*** Test Cases ***
+Verify Get Temperature Reading Command For Inlet Temperature Sensor
+    [Documentation]  Verify IPMI Get Temperature Reading command for inlet temperature sensor.
+    [Tags]  Verify_Get_Temperature_Reading_Command_For_Inlet_Temperature_Sensor
+
+    ${cmd}=  Catenate  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][0]}
+    ...  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][1]} 0x00 0x00
+    ${ipmi_resp}=  Run External IPMI Raw Command  ${cmd}
+    Verify Reading With IPMI  ${ipmi_resp}  ${1}  inlet
+    # Verify Temperature Reading With Dbus URI  ${ipmi_resp}  inlet  ${1}
+
+Verify Get Temperature Reading Command For CPU 0 Temperature Sensor
+    [Documentation]  Verify IPMI Get Temperature Reading command for cpu0 temperature sensor.
+    [Tags]  Verify_Get_Temperature_Reading_Command_For_CPU_0_Temperature_Sensor
+
+    ${cmd}=  Catenate  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][0]}
+    ...  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][2]} 0x00 0x00
+    ${ipmi_resp}=  Run External IPMI Raw Command  ${cmd}
+    Verify Reading With IPMI  ${ipmi_resp}  ${1}  cpu
+    # Verify Temperature Reading With Dbus URI  ${ipmi_resp}  cpu  ${1}
+
+Verify Get Temperature Reading Command For CPU 1 Temperature Sensor
+    [Documentation]  Verify IPMI Get Temperature Reading command for cpu1 temperature sensor.
+    [Tags]  Verify_Get_Temperature_Reading_Command_For_CPU_1_Temperature_Sensor
+
+    ${cmd}=  Catenate  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][0]}
+    ...  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][2]} 0x00 0x00
+    ${ipmi_resp}=  Run External IPMI Raw Command  ${cmd}
+    Verify Reading With IPMI  ${ipmi_resp}  ${2}  cpu
+    # Verify Temperature Reading With Dbus URI  ${ipmi_resp}  cpu  ${2}
+
+Verify Get Temperature Reading Command For Baseboard Temperature Sensor
+    [Documentation]  Verify IPMI Get Temperature Reading command for baseboard temperature sensor.
+    [Tags]  Verify_Get_Temperature_Reading_Command_For_Baseboard_Temperature_Sensor
+
+    ${cmd}=  Catenate  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][0]}
+    ...  ${DCMI_RAW_CMD['DCMI']['GET_TEMPERATURE_READING'][3]} 0x00 0x00
+    ${ipmi_resp}=  Run External IPMI Raw Command  ${cmd}
+    Verify Reading With IPMI  ${ipmi_resp}  ${1}  baseboard
+    # Verify Temperature Reading With Dbus URI  ${ipmi_resp}  baseboard  ${1}
+
+*** Keywords ***
+Suite Setup Execution
+    [Documentation]  Get dcmi sensors uri from config file.
+
+    IPMI Power On  stack_mode=skip  quiet=1
+
+    # Get this file to client machine /usr/share/ipmi-providers/dcmi_sensors.json
+    scp.Open Connection
+    ...  ${OPENBMC_HOST}  username=${OPENBMC_USERNAME}  password=${OPENBMC_PASSWORD}  port=${SSH_PORT}
+    scp.Get File  ${dcmi_sensors_info_json_file}  ${EXEC_DIR}
+    scp.Close Connection
+
+    ${config_file}=  OperatingSystem.Get File  ${client_config_file_path}
+    ${config_file_response}=  Evaluate  json.loads('''${config_file}''')  json
+
+    ${remove_configuration_file}=  Catenate  rm -rf ${client_config_file_path}
+    ${rc}  ${output}=  Shell Cmd  ${remove_configuration_file}
+
+    FOR  ${key}  ${value}  IN  &{config_file_response}
+      &{tmp}=  Create Dictionary
+      FOR  ${response}  IN  @{value}
+        ${sensor_dbus}=  Get From Dictionary  ${response}  dbus
+        ${instance}=  Get From Dictionary  ${response}  instance
+        Set To Dictionary  ${tmp}  ${instance}  ${sensor_dbus}
+      END
+      Set To Dictionary  ${dcmi_sensor_uri}  ${key}  ${tmp}
+    END
+
+Verify Temperature Reading With Dbus URI
+    [Documentation]  Verify temperature from ipmi response and json file.
+    [Arguments]  ${ipmi_resp}  ${key}  ${instance}
+
+    # Description of argument(s):
+    # ipmi_resp         IPMI command response.
+    # key               Entity ID description i.e inlet, cpu, baseboard.
+    # instance          instance number 1, 2, ..
+
+    ${dbus_uris}=  Get From Dictionary  ${dcmi_sensor_uri}  ${key}
+    ${dbus_uri}=  Get From Dictionary  ${dbus_uris}  ${instance}
+
+    ${get_reading_value}=  Set Variable If
+    ...  '${instance}' == '1'  ${3}
+    ...  '${instance}' == '2'  ${5}
+
+    ${ipmi_resp_list}=  Split String  ${ipmi_resp}
+    ${temperature_reading}=  Get From List  ${ipmi_resp_list}  ${get_reading_value}
+    ${temp_reading}=  Convert To Integer  ${temperature_reading}  16
+    ${busctl_cmd}=  Catenate  busctl introspect xyz.openbmc_project.HwmonTempSensor ${dbus_uri}
+    ${busctl_cmd_resp}=  BMC Execute Command  ${busctl_cmd}
+    ${current_temp_value_from_dbus}=  Get Regexp Matches  ${busctl_cmd_resp[0]}
+    ...  \\.Value\\s+property\\s+d\\s+(\\S+)\\s  1
+
+    ${min_value}=  Evaluate  ${temp_reading} - 1
+    ${max_value}=  Evaluate  ${temp_reading} + 1
+
+Check Reading Value In D-Bus
+    [Documentation]  Verify temperature from ipmi response and json file.
+    [Arguments]  ${key}  ${instance}  ${dcmi_reading_value}
+
+    # Description of argument(s):
+    # key               Entity ID description i.e inlet, cpu, baseboard.
+    # instance          instance number 1, 2, ..
+
+    ${dbus_uris}=  Get From Dictionary  ${dcmi_sensor_uri}  ${key}
+    ${dbus_uri}=  Get From Dictionary  ${dbus_uris}  ${instance}
+
+    ${busctl_cmd}=  Catenate  busctl introspect xyz.openbmc_project.HwmonTempSensor ${dbus_uri}
+    ${busctl_cmd_resp}=  BMC Execute Command  ${busctl_cmd}
+    ${current_temp_value_from_dbus}=  Get Regexp Matches  ${busctl_cmd_resp[0]}
+    ...  \\.Value\\s+property\\s+d\\s+(\\S+)\\s  1
+    Run Keyword If  '${current_temp_value_from_dbus[0]}' == 'nan' and '${dcmi_reading_value}' == '0'
+    ...  Fail  msg=sensor reading value is not present.
+    Run Keyword If  '${current_temp_value_from_dbus[0]}' != 'nan' and '${dcmi_reading_value}' == '0'
+    ...  Fail  msg=sensor reading value is showing as 0 in dcmi get temperature raw command.
+    ${dbus_reading_value}=  Set Variable  .${current_temp_value_from_dbus[0].split(".")[1].strip()}
+    ${status}=  Run Keyword And Return Status  Should Be True  ${dbus_reading_value} > .499
+    Run Keyword If  ${status} == False
+    ...  Fail  msg=sensor reading value is showing wrongly in dcmi get temperature raw command.
+    ${dbus_reading_value}=  Set Variable  ${current_temp_value_from_dbus[0].split(".")[0].strip()}
+    Should Be Equal  ${dcmi_reading_value}  ${dbus_reading_value}
+    ...  msg=sensor reading value is showing wrongly in dcmi get temperature raw command.
+
+Verify Reading With IPMI
+    [Documentation]  Verify temperature reading with ipmi command.
+    [Arguments]  ${ipmi_resp}  ${instance}  ${key}
+
+    # Description of argument(s):
+    # ipmi_resp         IPMI command response.
+    # instance          instance number 1, 2, ..
+    # key               Entity ID description i.e inlet, cpu, baseboard.
+
+    ${get_reading_value}=  Set Variable If
+    ...  '${instance}' == '1'  ${3}
+    ...  '${instance}' == '2'  ${5}
+
+    ${ipmi_resp_list}=  Split String  ${ipmi_resp}
+    ${temperature_reading}=  Get From List  ${ipmi_resp_list}  ${get_reading_value}
+    ${dcmi_reading}=  Convert To Integer  ${temperature_reading}  16
+    Run Keyword If  '${dcmi_reading}' == '0'
+    ...  Check Reading Value In D-Bus  ${key}  ${instance}  ${dcmi_reading}
+    ${dcmi_temp_reading}=  Convert To String  ${dcmi_reading}
+    ${ipmi_sensor_cmd_resp}=  Get IPMI Sensor Reading  ${key}  ${instance}
+    ${ipmi_sensor_cmd_resp_list}=  Split String  ${ipmi_sensor_cmd_resp}  |
+    ${ipmi_temp_reading}=  Set Variable  ${ipmi_sensor_cmd_resp_list[1].strip().split(".")[0]}
+    ${reading_status}=  Run Keyword And Return Status  Should Be Equal
+    ...  ${dcmi_temp_reading}  ${ipmi_temp_reading}
+    Run Keyword If  ${reading_status} == False
+    ...  Check Reading Value In D-Bus  ${key}  ${instance}  ${dcmi_temp_reading}
+
+Get IPMI Sensor Reading
+    [Documentation]  Return ipmi sensor reading.
+    [Arguments]  ${key}  ${instance}
+
+    # Description of argument(s):
+    # instance          Entity ID description i.e inlet, cpu, baseboard.
+    # index             Selecting the corresponding sensor dbus uri from list.
+
+    ${dbus_uris}=  Get From Dictionary  ${dcmi_sensor_uri}  ${key}
+    ${dbus_uri}=  Get From Dictionary  ${dbus_uris}  ${instance}
+    ${sensor_name}=  Set Variable  ${dbus_uri.split('/')[-1]}
+
+    ${ret}=  Run External IPMI Standard Command  sensor | grep -i "${sensor_name}"
+
+    [Return]  ${ret}