Add case to test Get Channel Info via IPMI

Command "Get Channel Info" is belongs to the IPMI Messaging
Support Commands in IPMI SPEC.

Signed-off-by: Tony Lee <tony.lee@quantatw.com>
Change-Id: Ia6c5e2c9b1ec8904df5859e450863f32b49f2558
diff --git a/data/ipmi_variable.py b/data/ipmi_variable.py
new file mode 100644
index 0000000..64aae68
--- /dev/null
+++ b/data/ipmi_variable.py
@@ -0,0 +1,50 @@
+#!/usr/bin/python
+
+r"""
+Contains channel-related constants.
+"""
+
+medium_type_ipmi_conf_map = {
+    "reserved": "reserved",
+    "IPMB (I2C)": "ipmb",
+    "ICMB v1.0": "icmb-v1.0",
+    "ICMB v0.9": "icmb-v0.9",
+    "802.3 LAN": "lan-802.3",
+    "Serial/Modem": "serial",
+    "Other LAN": "other-lan",
+    "PCI SMBus": "pci-smbus",
+    "SMBus v1.0/v1.1": "smbus-v1.0",
+    "SMBus v2.0": "smbus-v2.0",
+    "USB 1.x": "usb-1x",
+    "USB 2.x": "usb-2x",
+    "System Interface": "system-interface"
+}
+
+
+protocol_type_ipmi_conf_map = {
+    "reserved": "na",
+    "IPMB-1.0": "ipmb-1.0",
+    "ICMB-1.0": "icmb-2.0",
+    "reserved": "reserved",
+    "IPMI-SMBus": "ipmi-smbus",
+    "KCS": "kcs",
+    "SMIC": "smic",
+    "BT-10": "bt-10",
+    "BT-15": "bt-15",
+    "TMode": "tmode",
+    "OEM 1": "oem",
+}
+
+
+disabled_ipmi_conf_map = {
+    "disabled": "True",
+    "enabled": "False",
+}
+
+
+access_mode_ipmi_conf_map = {
+    "disabled": "disabled",
+    "pre-boot only": "pre-boot",
+    "always available": "always_available",
+    "shared": "shared",
+}
diff --git a/ipmi/test_ipmi_general.robot b/ipmi/test_ipmi_general.robot
index 59033a3..0c28039 100644
--- a/ipmi/test_ipmi_general.robot
+++ b/ipmi/test_ipmi_general.robot
@@ -4,6 +4,9 @@
 Resource         ../lib/ipmi_client.robot
 Resource         ../lib/openbmc_ffdc.robot
 Variables        ../data/ipmi_raw_cmd_table.py
+Variables        ../data/ipmi_variable.py
+Library          ../lib/bmc_network_utils.py
+Library          ../lib/ipmi_utils.py
 
 Test Teardown    FFDC On Test Case Fail
 
@@ -68,3 +71,56 @@
 
     Rprint Vars  guids  uuid
     Valid Value  uuid  ['${guids}']
+
+
+Verify Get Channel Info via IPMI
+    [Documentation]  Verify get channel info via IPMI.
+    [Tags]  Verify_Get_Channel_Info_via_IPMI
+
+    # Get channel info via ipmi command "ipmitool channel info [channel number]".
+    # Verify channel info with files "channel_access.json" and "channel_config.json" in BMC.
+
+    # Example output from 'Get Channel Info':
+    # channel_info:
+    #   [channel_0x2_info]:
+    #     [channel_medium_type]:                        802.3 LAN
+    #     [channel_protocol_type]:                      IPMB-1.0
+    #     [session_support]:                            multi-session
+    #     [active_session_count]:                       0
+    #     [protocol_vendor_id]:                         7154
+    #     [volatile(active)_settings]:
+    #     [alerting]:                                   enabled
+    #     [per-message_auth]:                           enabled
+    #     [user_level_auth]:                            enabled
+    #     [access_mode]:                                always available
+
+    ${channel_info_ipmi}=  Get Channel Info  ${CHANNEL_NUMBER}
+    ${active_channel_config}=  Get Active Channel Config
+    ${channel_access_config}=  Get Channel Access Config
+    Rprint Vars  channel_info_ipmi  active_channel_config  channel_access_config
+
+    Valid Value  medium_type_ipmi_conf_map['${channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['channel_medium_type']}']
+    ...  ['${active_channel_config['${CHANNEL_NUMBER}']['channel_info']['medium_type']}']
+
+    Valid Value  protocol_type_ipmi_conf_map['${channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['channel_protocol_type']}']
+    ...  ['${active_channel_config['${CHANNEL_NUMBER}']['channel_info']['protocol_type']}']
+
+    Valid Value  channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['session_support']
+    ...  ['${active_channel_config['${CHANNEL_NUMBER}']['channel_info']['session_supported']}']
+
+    Valid Value  channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['active_session_count']
+    ...  ['${active_channel_config['${CHANNEL_NUMBER}']['active_sessions']}']
+    # IPMI Spec: The IPMI Enterprise Number is: 7154 (decimal)
+    Valid Value  channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['protocol_vendor_id']  ['7154']
+
+    Valid Value  disabled_ipmi_conf_map['${channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['alerting']}']
+    ...  ['${channel_access_config['${CHANNEL_NUMBER}']['alerting_disabled']}']
+
+    Valid Value  disabled_ipmi_conf_map['${channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['per-message_auth']}']
+    ...  ['${channel_access_config['${CHANNEL_NUMBER}']['per_msg_auth_disabled']}']
+
+    Valid Value  disabled_ipmi_conf_map['${channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['user_level_auth']}']
+    ...  ['${channel_access_config['${CHANNEL_NUMBER}']['user_auth_disabled']}']
+
+    Valid Value  access_mode_ipmi_conf_map['${channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['access_mode']}']
+    ...  ['${channel_access_config['${CHANNEL_NUMBER}']['access_mode']}']
diff --git a/lib/bmc_network_utils.py b/lib/bmc_network_utils.py
index 93f932b..7e91604 100644
--- a/lib/bmc_network_utils.py
+++ b/lib/bmc_network_utils.py
@@ -176,3 +176,31 @@
     """
 
     return vf.filter_struct(get_channel_config(), "[('medium_type', 'other-lan|lan-802.3')]", regex=1)
+
+
+def get_channel_access_config():
+    r"""
+    Get the channel access config data and return as a dictionary.
+
+    Example:
+
+    channel_access_config =  get_channel_access_config()
+    print_vars(channel_access_config)
+
+    channel_access_config:
+        [1]:
+            [priv_limit]:                                 priv-admin
+            [per_msg_auth_disabled]:                      False
+            [access_mode]:                                always_available
+            [alerting_disabled]:                          False
+            [user_auth_disabled]:                         False
+        [2]:
+            [priv_limit]:                                 priv-admin
+            [per_msg_auth_disabled]:                      False
+            [access_mode]:                                always_available
+            [alerting_disabled]:                          False
+            [user_auth_disabled]:                         False
+    """
+    stdout, stderr, rc = bsu.bmc_execute_command("cat /usr/share/ipmi-providers/channel_access.json")
+
+    return json.loads(stdout)
diff --git a/lib/ipmi_utils.py b/lib/ipmi_utils.py
index 4bdf6ad..d8c9be7 100644
--- a/lib/ipmi_utils.py
+++ b/lib/ipmi_utils.py
@@ -622,3 +622,34 @@
     result = vf.key_value_outbuf_to_dict(ret_values, process_indent=1)
 
     return result
+
+
+def get_channel_info(channel_number=1):
+    r"""
+    Get the channel info and return as a dictionary.
+    Example:
+
+    channel_info:
+      [channel_0x2_info]:
+        [channel_medium_type]:                        802.3 LAN
+        [channel_protocol_type]:                      IPMB-1.0
+        [session_support]:                            multi-session
+        [active_session_count]:                       0
+        [protocol_vendor_id]:                         7154
+        [volatile(active)_settings]:
+        [alerting]:                                   enabled
+        [per-message_auth]:                           enabled
+        [user_level_auth]:                            enabled
+        [access_mode]:                                always available
+        [non-volatile_settings]:
+        [alerting]:                                   enabled
+        [per-message_auth]:                           enabled
+        [user_level_auth]:                            enabled
+        [access_mode]:                                always available
+    """
+
+    status, ret_values = \
+        grk.run_key_u("Run IPMI Standard Command  channel info " + str(channel_number))
+    result = vf.key_value_outbuf_to_dict(ret_values, process_indent=1)
+
+    return result