|  | Documentation  Utility for SNMP configurations via Redfish. | 
|  |  | 
|  | *** Settings *** | 
|  |  | 
|  | Resource                ../../lib/utils.robot | 
|  | Resource                ../../lib/connection_client.robot | 
|  | Library                 ../../lib/gen_misc.py | 
|  | Library                 ../../lib/utils.py | 
|  |  | 
|  | *** Variables *** | 
|  |  | 
|  | ${snmp_function}     SNMPTrap | 
|  | ${snmp_version}      SNMPv2c | 
|  | ${subscription_uri}  /redfish/v1/EventService/Subscriptions | 
|  |  | 
|  | ${CMD_INTERNAL_FAILURE}  busctl call xyz.openbmc_project.Logging /xyz/openbmc_project/logging | 
|  | ...  xyz.openbmc_project.Logging.Create Create ssa{ss} xyz.openbmc_project.Common.Error.InternalFailure | 
|  | ...  xyz.openbmc_project.Logging.Entry.Level.Error 0 | 
|  |  | 
|  | ${CMD_FRU_CALLOUT}  busctl call xyz.openbmc_project.Logging /xyz/openbmc_project/logging | 
|  | ...  xyz.openbmc_project.Logging.Create Create ssa{ss} xyz.openbmc_project.Common.Error.Timeout | 
|  | ...  xyz.openbmc_project.Logging.Entry.Level.Error 2 "TIMEOUT_IN_MSEC" "5" | 
|  | ...  "CALLOUT_INVENTORY_PATH" "/xyz/openbmc_project/inventory/system/chassis/motherboard" | 
|  |  | 
|  | ${CMD_INFORMATIONAL_ERROR}  busctl call xyz.openbmc_project.Logging /xyz/openbmc_project/logging | 
|  | ...  xyz.openbmc_project.Logging.Create Create ssa{ss} xyz.openbmc_project.Common.Error.TestError2 | 
|  | ...  xyz.openbmc_project.Logging.Entry.Level.Informational 0 | 
|  |  | 
|  | ${SNMP_TRAP_BMC_INTERNAL_FAILURE}  xyz.openbmc_project.Common.Error.InternalFailure | 
|  | ${SNMP_TRAP_BMC_CALLOUT_ERROR}  xyz.openbmc_project.Common.Error.Timeout | 
|  | ...  CALLOUT_INVENTORY_PATH=/xyz/openbmc_project/inventory/system/chassis/motherboard TIMEOUT_IN_MSEC=5 | 
|  | ${SNMP_TRAP_BMC_INFORMATIONAL_ERROR}  xyz.openbmc_project.Common.Error.TestError2 | 
|  |  | 
|  |  | 
|  | *** Keywords *** | 
|  |  | 
|  | Get SNMP Manager List | 
|  | [Documentation]  Get the list of SNMP managers and return IP addresses and ports. | 
|  |  | 
|  | # Get the list of SNMP manager URIs. | 
|  | @{snmp_mgr_uris}=  Get SNMP Child URIs | 
|  |  | 
|  | ${snmp_mgr_list}=  Create List | 
|  |  | 
|  | FOR  ${snmp_mgr_uri}  IN  @{snmp_mgr_uris} | 
|  | # Sample output: | 
|  | # { | 
|  | #  "@odata.id": "/redfish/v1/EventService/Subscriptions/snmp1", | 
|  | #  "@odata.type": "#EventDestination.v1_7_0.EventDestination", | 
|  | #  "Context": "", | 
|  | #  "Destination": "snmp://xx.xx.xx.xx:162", | 
|  | #  "EventFormatType": "Event", | 
|  | #  "Id": "snmp1", | 
|  | #  "Name": "Event Destination snmp1", | 
|  | #  "Protocol": "SNMPv2c", | 
|  | #  "SubscriptionType": "SNMPTrap" | 
|  |  | 
|  | ${resp}=  Redfish.Get  ${snmp_mgr_uri} | 
|  | ${snmp_mgr}=  Get From Dictionary  ${resp.dict}  Destination | 
|  | Append To List  ${snmp_mgr_list}  ${snmp_mgr} | 
|  | END | 
|  |  | 
|  | [Return]  ${snmp_mgr_list} | 
|  |  | 
|  |  | 
|  | Configure SNMP Manager Via Redfish | 
|  | [Documentation]  Configure SNMP manager on BMC via Redfish. | 
|  | [Arguments]  ${snmp_mgr_ip}  ${snmp_port}  ${valid_status_codes}=${HTTP_CREATED} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # snmp_mgr_ip  SNMP manager IP address | 
|  | # snmp_port  SNMP manager port | 
|  | # valid_status_code  expected code | 
|  |  | 
|  | ${snmp_mgr_data}=  Create Dictionary  Destination=snmp://${snmp_mgr_ip}:${snmp_port} | 
|  | ...  SubscriptionType=${snmp_function}  Protocol=${snmp_version} | 
|  |  | 
|  | Redfish.Post  ${subscription_uri}  body=&{snmp_mgr_data} | 
|  | ...  valid_status_codes=[${valid_status_codes}] | 
|  |  | 
|  |  | 
|  | Verify SNMP Manager Configured On BMC | 
|  | [Documentation]  Verify SNMP manager configured on BMC. | 
|  | [Arguments]  ${snmp_mgr_ip}  ${snmp_port} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # snmp_mgr_ip  SNMP manager IP address | 
|  | # snmp_port  SNMP manager port | 
|  |  | 
|  | # Get the list of SNMP managers that are configured on BMC. | 
|  | @{snmp_mgr_list}=  Get SNMP Manager List | 
|  |  | 
|  | ${snmp_ip_port}=  Catenate  ${snmp_mgr_ip}:${snmp_port} | 
|  |  | 
|  | List Should Contain Value  ${snmp_mgr_list}  snmp://${snmp_ip_port} | 
|  | ...  msg=SNMP manager is not configured. | 
|  |  | 
|  |  | 
|  | Get SNMP Child URIs | 
|  | [Documentation]  Get the list of all SNMP manager URIs. | 
|  |  | 
|  | # Sample output of SNMP URI: | 
|  | # { | 
|  | #  "@odata.id": "/redfish/v1/EventService/Subscriptions", | 
|  | #  "@odata.type": "#EventDestinationCollection.EventDestinationCollection", | 
|  | #  "Members": [ | 
|  | #    { | 
|  | #      "@odata.id": "/redfish/v1/EventService/Subscriptions/snmp6" | 
|  | #    }, | 
|  | #    { | 
|  | #      "@odata.id": "/redfish/v1/EventService/Subscriptions/snmp2" | 
|  | #    }, | 
|  | #    { | 
|  | #      "@odata.id": "/redfish/v1/EventService/Subscriptions/snmp9" | 
|  | #    }, | 
|  | #    { | 
|  | #      "@odata.id": "/redfish/v1/EventService/Subscriptions/snmp1" | 
|  | #    }, | 
|  | #    { | 
|  | #      "@odata.id": "/redfish/v1/EventService/Subscriptions/snmp8" | 
|  | #    }, | 
|  | #    { | 
|  | #      "@odata.id": "/redfish/v1/EventService/Subscriptions/snmp4" | 
|  | #    }, | 
|  | #    { | 
|  | #      "@odata.id": "/redfish/v1/EventService/Subscriptions/snmp7" | 
|  | #    }, | 
|  | #    { | 
|  | #      "@odata.id": "/redfish/v1/EventService/Subscriptions/snmp5" | 
|  | #    }, | 
|  | #    { | 
|  | #      "@odata.id": "/redfish/v1/EventService/Subscriptions/snmp3" | 
|  | #    } | 
|  | #  ], | 
|  | #  "Members@odata.count": 9, | 
|  | #  "Name": "Event Destination Collections" | 
|  |  | 
|  | # Get the list of child URIs. | 
|  | @{snmp_mgr_uris}=  Redfish.Get Members List  ${subscription_uri}  filter=snmp | 
|  |  | 
|  | [Return]  ${snmp_mgr_uris} | 
|  |  | 
|  |  | 
|  | Delete SNMP Manager Via Redfish | 
|  | [Documentation]  Delete SNMP manager. | 
|  | [Arguments]  ${snmp_mgr_ip}  ${snmp_port} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # snmp_mgr_ip  SNMP manager IP. | 
|  | # snmp_port    Network port where SNMP manager is listening. | 
|  |  | 
|  | ${is_snmp_found}=  Set Variable  ${False} | 
|  | ${snmp_ip_port}=  Catenate  ${snmp_mgr_ip}:${snmp_port} | 
|  |  | 
|  | # Get the list of SNMP manager URIs. | 
|  | @{snmp_mgr_uris}=  Get SNMP Child URIs | 
|  |  | 
|  | # Find the SNMP manager URI that has IP and port configured. | 
|  | FOR  ${snmp_mgr_uri}  IN  @{snmp_mgr_uris} | 
|  | # Sample output: | 
|  | # { | 
|  | #  "@odata.id": "/redfish/v1/EventService/Subscriptions/snmp1", | 
|  | #  "@odata.type": "#EventDestination.v1_7_0.EventDestination", | 
|  | #  "Context": "", | 
|  | #  "Destination": "snmp://xx.xx.xx.xx:162", | 
|  | #  "EventFormatType": "Event", | 
|  | #  "Id": "snmp1", | 
|  | #  "Name": "Event Destination snmp1", | 
|  | #  "Protocol": "SNMPv2c", | 
|  | #  "SubscriptionType": "SNMPTrap" | 
|  |  | 
|  | # Find the SNMP manager that has matching destination details. | 
|  | ${snmp_mgr}=  Redfish.Get Attribute  ${snmp_mgr_uri}  Destination | 
|  |  | 
|  | # Delete the SNMP manager if the requested IP & ports are found | 
|  | # and mark is_snmp_found to true. | 
|  | Run Keyword If  'snmp://${snmp_ip_port}' == '${snmp_mgr}' | 
|  | ...  Run Keywords  Set Local Variable  ${is_snmp_found}  ${True} | 
|  | ...  AND  Redfish.Delete  ${snmp_mgr_uri} | 
|  | ...  AND  Exit For Loop | 
|  | END | 
|  |  | 
|  | Pass Execution If  ${is_snmp_found} == ${False} | 
|  | ...  SNMP Manager: ${snmp_mgr_ip}:${snmp_port} is not configured on BMC | 
|  |  | 
|  | # Check if the SNMP manager is really deleted from BMC. | 
|  | ${status}=  Run Keyword And Return Status | 
|  | ...  Verify SNMP Manager Configured On BMC  ${snmp_mgr_ip}  ${snmp_port} | 
|  |  | 
|  | Should Be Equal  ${status}  ${False}  msg=SNMP manager is not deleted in the backend. | 
|  |  | 
|  |  | 
|  | Create Error On BMC And Verify Trap | 
|  | [Documentation]  Generate error on BMC and verify if trap is sent. | 
|  | [Arguments]  ${event_log}=${CMD_INTERNAL_FAILURE}  ${expected_error}=${SNMP_TRAP_BMC_INTERNAL_FAILURE} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # event_log       Event logs to be created. | 
|  | # expected_error  Expected error on SNMP. | 
|  |  | 
|  | Configure SNMP Manager Via Redfish  ${SNMP_MGR1_IP}  ${SNMP_DEFAULT_PORT}  ${HTTP_CREATED} | 
|  |  | 
|  | Start SNMP Manager | 
|  |  | 
|  | # Generate error log. | 
|  | BMC Execute Command  ${event_log} | 
|  |  | 
|  | SSHLibrary.Switch Connection  snmp_server | 
|  | ${SNMP_LISTEN_OUT}=  Read  delay=1s | 
|  |  | 
|  | Delete SNMP Manager Via Redfish  ${SNMP_MGR1_IP}  ${SNMP_DEFAULT_PORT} | 
|  |  | 
|  | # Stop SNMP manager process. | 
|  | SSHLibrary.Execute Command  sudo killall snmptrapd | 
|  |  | 
|  | # Sample SNMP trap: | 
|  | # 2021-06-16 07:05:29 xx.xx.xx.xx [UDP: [xx.xx.xx.xx]:58154->[xx.xx.xx.xx]:xxx]: | 
|  | # DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (2100473) 5:50:04.73 | 
|  | #   SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::enterprises.49871.1.0.0.1 | 
|  | #  SNMPv2-SMI::enterprises.49871.1.0.1.1 = Gauge32: 369    SNMPv2-SMI::enterprises.49871.1.0.1.2 = Opaque: | 
|  | # UInt64: 1397718405502468474     SNMPv2-SMI::enterprises.49871.1.0.1.3 = INTEGER: 3 | 
|  | #      SNMPv2-SMI::enterprises.49871.1.0.1.4 = STRING: "xxx.xx.xx Failure" | 
|  |  | 
|  | ${lines}=  Split To Lines  ${SNMP_LISTEN_OUT} | 
|  | ${trap_info}=  Get From List  ${lines}  -1 | 
|  | ${snmp_trap}=  Split String  ${trap_info}  \t | 
|  |  | 
|  | Verify SNMP Trap  ${snmp_trap}  ${expected_error} | 
|  |  | 
|  | [Return]  ${snmp_trap} | 
|  |  | 
|  |  | 
|  | Verify SNMP Trap | 
|  | [Documentation]  Verify SNMP trap. | 
|  | [Arguments]  ${snmp_trap}  ${expected_error}=${SNMP_TRAP_BMC_INTERNAL_FAILURE} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # snmp_trap       SNMP trap collected on SNMP manager. | 
|  | # expected_error  Expected error on SNMP. | 
|  |  | 
|  | # Verify all the mandatory fields of trap. | 
|  | Should Contain  ${snmp_trap}[0]  DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: | 
|  | Should Be Equal  ${snmp_trap}[1]  SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::enterprises.49871.1.0.0.1 | 
|  | Should Match Regexp  ${snmp_trap}[2]  SNMPv2-SMI::enterprises.49871.1.0.1.1 = Gauge32: \[0-9]* | 
|  | Should Match Regexp  ${snmp_trap}[3]  SNMPv2-SMI::enterprises.49871.1.0.1.2 = Opaque: UInt64: \[0-9]* | 
|  | Should Match Regexp  ${snmp_trap}[4]  SNMPv2-SMI::enterprises.49871.1.0.1.3 = INTEGER: \[0-9] | 
|  | Should Be Equal  ${snmp_trap}[5]  SNMPv2-SMI::enterprises.49871.1.0.1.4 = STRING: "${expected_error}" | 
|  |  | 
|  |  | 
|  | Start SNMP Manager | 
|  | [Documentation]  Start SNMP listener on the remote SNMP manager. | 
|  |  | 
|  | Open Connection And Log In  ${SNMP_MGR1_USERNAME}  ${SNMP_MGR1_PASSWORD} | 
|  | ...  alias=snmp_server  host=${SNMP_MGR1_IP} | 
|  |  | 
|  | # Clean SNMP managers running in the background. | 
|  | SSHLibrary.Execute Command  killall snmptrapd | 
|  |  | 
|  | # The execution of the SNMP_TRAPD_CMD is necessary to cause SNMP to begin | 
|  | # listening to SNMP messages. | 
|  | SSHLibrary.write  ${SNMP_TRAPD_CMD} & | 
|  |  | 
|  |  | 
|  | Create Error On BMC And Verify Trap On Non Default Port | 
|  | [Documentation]  Generate error on BMC and verify if trap is sent to non default port. | 
|  | [Arguments]  ${event_log}=${CMD_INTERNAL_FAILURE}  ${expected_error}=${SNMP_TRAP_BMC_INTERNAL_FAILURE} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # event_log       Event logs to be created. | 
|  | # expected_error  Expected error on SNMP. | 
|  |  | 
|  | Configure SNMP Manager Via Redfish  ${SNMP_MGR1_IP}  ${NON_DEFAULT_PORT1} | 
|  |  | 
|  | Start SNMP Manager On Specific Port  ${SNMP_MGR1_IP}  ${NON_DEFAULT_PORT1} | 
|  |  | 
|  | # Generate error log. | 
|  | BMC Execute Command  ${event_log} | 
|  |  | 
|  | SSHLibrary.Switch Connection  snmp_server | 
|  | ${SNMP_LISTEN_OUT}=  Read  delay=1s | 
|  |  | 
|  | Delete SNMP Manager Via Redfish  ${SNMP_MGR1_IP}  ${NON_DEFAULT_PORT1} | 
|  |  | 
|  | # Stop SNMP manager process. | 
|  | SSHLibrary.Execute Command  sudo killall snmptrapd | 
|  |  | 
|  | # Sample SNMP trap: | 
|  | # 2021-06-16 07:05:29 xx.xx.xx.xx [UDP: [xx.xx.xx.xx]:58154->[xx.xx.xx.xx]:xxx]: | 
|  | # DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (2100473) 5:50:04.73 | 
|  | #   SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::enterprises.49871.1.0.0.1 | 
|  | #  SNMPv2-SMI::enterprises.49871.1.0.1.1 = Gauge32: 369    SNMPv2-SMI::enterprises.49871.1.0.1.2 = Opaque: | 
|  | # UInt64: 1397718405502468474     SNMPv2-SMI::enterprises.49871.1.0.1.3 = INTEGER: 3 | 
|  | #      SNMPv2-SMI::enterprises.49871.1.0.1.4 = STRING: "xxx.xx.xx Failure" | 
|  |  | 
|  | ${lines}=  Split To Lines  ${SNMP_LISTEN_OUT} | 
|  | ${trap_info}=  Get From List  ${lines}  -1 | 
|  | ${snmp_trap}=  Split String  ${trap_info}  \t | 
|  |  | 
|  | Verify SNMP Trap  ${snmp_trap}  ${expected_error} | 
|  |  | 
|  | [Return]  ${snmp_trap} | 
|  |  | 
|  |  | 
|  | Start SNMP Manager On Specific Port | 
|  | [Documentation]  Start SNMP listener on specific port on the remote SNMP manager. | 
|  | [Arguments]  ${snmp_mgr_ip}  ${snmp_port} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # snmp_mgr_ip  SNMP manager IP. | 
|  | # snmp_port    Network port on which SNMP manager need to run. | 
|  |  | 
|  | ${ip_and_port}=  Catenate  ${snmp_mgr_ip}:${snmp_port} | 
|  |  | 
|  | Open Connection And Log In  ${SNMP_MGR1_USERNAME}  ${SNMP_MGR1_PASSWORD} | 
|  | ...  alias=snmp_server  host=${SNMP_MGR1_IP} | 
|  |  | 
|  | # The execution of the SNMP_TRAPD_CMD is necessary to cause SNMP to begin | 
|  | # listening to SNMP messages. | 
|  | SSHLibrary.write  ${SNMP_TRAPD_CMD} ${ip_and_port} & | 
|  |  | 
|  |  | 
|  | Generate Error On BMC And Verify Trap | 
|  | [Documentation]  Generate error on BMC and verify if trap is sent. | 
|  | [Arguments]  ${event_log}=${CMD_INTERNAL_FAILURE}  ${expected_error}=${SNMP_TRAP_BMC_INTERNAL_FAILURE} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # event_log       Event logs to be created. | 
|  | # expected_error  Expected error on SNMP. | 
|  |  | 
|  | Start SNMP Manager | 
|  |  | 
|  | # Generate error log. | 
|  | BMC Execute Command  ${event_log} | 
|  |  | 
|  | SSHLibrary.Switch Connection  snmp_server | 
|  | ${SNMP_LISTEN_OUT}=  Read  delay=1s | 
|  |  | 
|  | Delete SNMP Manager Via Redfish  ${SNMP_MGR1_IP}  ${SNMP_DEFAULT_PORT} | 
|  |  | 
|  | # Stop SNMP manager process. | 
|  | SSHLibrary.Execute Command  sudo killall snmptrapd | 
|  |  | 
|  | # Sample SNMP trap: | 
|  | # 2021-06-16 07:05:29 xx.xx.xx.xx [UDP: [xx.xx.xx.xx]:58154->[xx.xx.xx.xx]:xxx]: | 
|  | # DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (2100473) 5:50:04.73 | 
|  | #   SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::enterprises.49871.1.0.0.1 | 
|  | #  SNMPv2-SMI::enterprises.49871.1.0.1.1 = Gauge32: 369    SNMPv2-SMI::enterprises.49871.1.0.1.2 = Opaque: | 
|  | # UInt64: 1397718405502468474     SNMPv2-SMI::enterprises.49871.1.0.1.3 = INTEGER: 3 | 
|  | #      SNMPv2-SMI::enterprises.49871.1.0.1.4 = STRING: "xxx.xx.xx Failure" | 
|  |  | 
|  | ${lines}=  Split To Lines  ${SNMP_LISTEN_OUT} | 
|  | ${trap_info}=  Get From List  ${lines}  -1 | 
|  | ${snmp_trap}=  Split String  ${trap_info}  \t | 
|  |  | 
|  | Verify SNMP Trap  ${snmp_trap}  ${expected_error} | 
|  |  | 
|  | [Return]  ${snmp_trap} | 
|  |  |