Add redfish systems inventory check

Add module which checks DIMM and CPU inventory under redfish/systems.

Signed-off-by: Steven Sombar <ssombar@us.ibm.com>
Change-Id: Ic65347500957be5df78eb005775caf375b9a111d
diff --git a/redfish/systems/test_systems_inventory.robot b/redfish/systems/test_systems_inventory.robot
new file mode 100755
index 0000000..2bda832
--- /dev/null
+++ b/redfish/systems/test_systems_inventory.robot
@@ -0,0 +1,126 @@
+*** Settings ***
+Documentation       Inventory of hardware resources under systems.
+
+Resource            ../../lib/bmc_redfish_resource.robot
+Resource            ../../lib/bmc_redfish_utils.robot
+Resource            ../../lib/openbmc_ffdc.robot
+
+Suite Setup         Suite Setup Execution
+Suite Teardown      Suite Teardown Execution
+Test Teardown       Test Teardown Execution
+
+*** Variables ***
+
+# The passing criteria.  Must have at least this many.
+${min_count_dimm}   2
+${min_count_cpu}    1
+
+
+*** Test Cases ***
+
+Get Processor Inventory Via Redfish And Verify
+    [Documentation]  Get the number of CPUs that are functional and enabled.
+    [Tags]  Get_Processor_Inventory_Via_Redfish_And_Verify
+
+    ${num_cpus}=  Count OK And Enabled  cpu  Processors
+    Rprint Vars  num_cpus
+    Run Keyword If  ${num_cpus} < ${min_count_cpu}
+    ...  Fail  msg=Insufficient CPU count.
+
+
+Get Memory Inventory Via Redfish And Verify
+    [Documentation]  Get the number of DIMMs that are functional and enabled.
+    [Tags]  Get_Memory_Inventory_Via_Redfish_And_Verify
+
+    ${num_dimms}=  Count OK And Enabled  dimm  Memory
+    Rprint Vars  num_dimms
+    Run Keyword If  ${num_dimms} < ${min_count_dimm}
+    ...  Fail  msg=Insufficient DIMM count.
+
+
+*** Keywords ***
+
+
+Count OK And Enabled
+    [Documentation]  Return the number of items that are OK and Enabled.
+    [Arguments]  ${item}  ${general_resource}
+
+    # Count the number of OK and Enabled items within a general_resource.
+    # Example:   Count the number of cpus under
+    # /redfish/v1/Systems/system/Processors
+
+    # Description of Argument(s):
+    # item              A hardware item within a general resource that has
+    #                   "Health" and "State" atributes,  E.g. "cpu" or "dimm".
+    # general_resource  A systems resource type that contains these items, such
+    #                   as "Processors", or "Memory".
+
+    ${num_items}=  Set Variable  0
+
+    ${resources}=  Redfish_Utils.List Request
+    ...  /redfish/v1/Systems/system/${general_resource}
+    #  Example response if general_resource = "Memory":
+    #   /redfish/v1/Systems/system/Memory
+    #   /redfish/v1/Systems/system/Memory/dimm0
+    #   /redfish/v1/Systems/system/Memory/dimm1
+    #   /redfish/v1/Systems/system/Memory/dimm2
+    #   etc.
+    #  Example response if general_resource = "Processors":
+    #   /redfish/v1/Systems/system/Processors
+    #   /redfish/v1/Systems/system/Processors/cpu0
+    #   /redfish/v1/Systems/system/Processors/cpu1
+
+    :FOR  ${resource}  IN  @{resources}
+    \  ${valid}=  Is Item Enabled And Health Ok  ${item}  ${resource}
+    \  ${increment}=  Run Keyword If
+    ...  ${valid}  Set Variable  ${1}  ELSE  Set Variable  ${0}
+    \  ${num_items}=  Evaluate  ${num_items}+${increment}
+
+    [Return]  ${num_items}
+
+
+Is Item Enabled And Health Ok
+    [Documentation]  Return ${True} if the item is OK and Enabled.
+    [Arguments]  ${item}  ${resource}
+
+    # Description of Argument(s):
+    # item          A hardware item within a general resource that has
+    #               "Health" and "State" atributes,  E.g. "dimm".
+    # resource      An individual resource to check, for example,
+    #               "/redfish/v1/Systems/system/Memory/dimm0".
+
+    # Return if item is not in the resource string.  This
+    # might be a top-level resource which is not a specific hardware item.
+    # Example:  Return if resource = "/redfish/v1/Systems/system/Memory" but
+    # continue if resource = "/redfish/v1/Systems/system/Memory/dimm1".
+    ${valid_parameter}=  Evaluate  "${item}" in "${resource}"
+    Return From Keyword If  not ${valid_parameter}  ${False}
+
+    ${status_detail}=  Redfish.Get
+    ...  ${resource}  valid_status_codes=[${HTTP_OK}]
+
+    ${health}=   Set Variable  ${status_detail.dict["Status"]["Health"]}
+    ${state}=  Set Variable  ${status_detail.dict["Status"]["State"]}
+
+    Return From Keyword If
+    ...  "${health}" == "OK" and "${state}" == "Enabled"  ${True}
+
+    [Return]  ${False}
+
+
+Suite Teardown Execution
+    [Documentation]  Do the post suite teardown.
+
+    Redfish.Logout
+
+
+Suite Setup Execution
+    [Documentation]  Do test case setup tasks.
+
+    Redfish.Login
+
+
+Test Teardown Execution
+    [Documentation]  Do the post test teardown.
+
+    FFDC On Test Case Fail