blob: 3af3e1feb7fa05744a78b26b33fa9e63a4cdd87f [file] [log] [blame]
*** Settings ***
Documentation Test BMC multiple network interface functionalities.
... Run on setup with both eth0 and eth1 in static mode.
# User input BMC IP for the eth1.
# Use can input as -v OPENBMC_HOST_1:xx.xxx.xx from command line.
Library ../../lib/bmc_redfish.py https://${OPENBMC_HOST_1}:${HTTPS_PORT}
... ${OPENBMC_USERNAME} ${OPENBMC_PASSWORD} WITH NAME Redfish1
Resource ../../lib/resource.robot
Resource ../../lib/common_utils.robot
Resource ../../lib/connection_client.robot
Resource ../../lib/bmc_network_utils.robot
Resource ../../lib/openbmc_ffdc.robot
Resource ../../lib/bmc_ldap_utils.robot
Resource ../../lib/snmp/resource.robot
Resource ../../lib/snmp/redfish_snmp_utils.robot
Resource ../../lib/certificate_utils.robot
Resource ../../lib/protocol_setting_utils.robot
Library ../../lib/jobs_processing.py
Library OperatingSystem
Suite Setup Suite Setup Execution
Test Setup Run Keywords Redfish.Login AND Redfish1.Login
Test Teardown Run Keywords FFDC On Test Case Fail AND Redfish.Logout AND Redfish1.Logout
Suite Teardown Run Keywords Redfish1.Logout AND Redfish.Logout
*** Variables ***
${cmd_prefix} ipmitool -I lanplus -C 17 -p 623 -U ${IPMI_USERNAME} -P ${IPMI_PASSWORD}
${test_ipv4_addr} 10.7.7.7
${test_ipv4_addr2} 10.7.7.8
${test_subnet_mask} 255.255.255.0
*** Test Cases ***
Verify Both Interfaces BMC IP Addresses Accessible Via SSH
[Documentation] Verify both interfaces (eth0, eth1) BMC IP addresses accessible via SSH.
[Tags] Verify_Both_Interfaces_BMC_IP_Addresses_Accessible_Via_SSH
Open Connection And Log In ${OPENBMC_USERNAME} ${OPENBMC_PASSWORD} host=${OPENBMC_HOST}
Open Connection And Log In ${OPENBMC_USERNAME} ${OPENBMC_PASSWORD} host=${OPENBMC_HOST_1}
Close All Connections
Verify Redfish Works On Both Interfaces
[Documentation] Verify access BMC with both interfaces (eth0, eth1) IP addresses via Redfish.
[Tags] Verify_Redfish_Works_On_Both_Interfaces
[Teardown] Run Keywords
... Configure Hostname ${hostname} AND Validate Hostname On BMC ${hostname}
${hostname}= Redfish.Get Attribute ${REDFISH_NW_PROTOCOL_URI} HostName
${data}= Create Dictionary HostName=openbmc
Redfish1.patch ${REDFISH_NW_ETH_IFACE}eth1 body=&{data}
... valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}]
Validate Hostname On BMC openbmc
${resp1}= Redfish.Get ${REDFISH_NW_ETH_IFACE}eth0
${resp2}= Redfish1.Get ${REDFISH_NW_ETH_IFACE}eth1
Should Be Equal ${resp1.dict['HostName']} ${resp2.dict['HostName']}
Verify LDAP Login Works When Eth1 IP Is Not Configured
[Documentation] Verify LDAP login works when eth1 IP is erased.
[Tags] Verify_LDAP_Login_Works_When_Eth1_IP_Is_Not_Configured
[Setup] Run Keywords Set Test Variable ${CHANNEL_NUMBER} ${SECONDARY_CHANNEL_NUMBER}
... AND Redfish.Login AND Delete IP Address ${OPENBMC_HOST_1}
[Teardown] Run Keywords Redfish.Logout AND Redfish.Login AND
... Add IP Address ${OPENBMC_HOST_1} ${eth1_subnet_mask} ${eth1_gateway}
Create LDAP Configuration
Redfish.Logout
Sleep 30
Redfish.Login ${LDAP_USER} ${LDAP_USER_PASSWORD}
Verify LDAP Login Works When Both Interfaces Are Configured
[Documentation] Verify LDAP login works when both interfaces are configured.
[Tags] Verify_LDAP_Login_Works_When_Both_Interfaces_Are_Configured
Create LDAP Configuration
Redfish.Logout
Sleep 30
Redfish.Login ${LDAP_USER} ${LDAP_USER_PASSWORD}
Verify Secure LDAP Login Works When Both Interfaces Are Configured
[Documentation] Verify Secure LDAP login works when both the interfaces are configured.
[Tags] Verify_Secure_LDAP_Login_Works_When_Both_Interfaces_Are_Configured
Create LDAP Configuration ${LDAP_TYPE} ${LDAP_SERVER_URI_1} ${LDAP_BIND_DN}
... ${LDAP_BIND_DN_PASSWORD} ${LDAP_BASE_DN}
Redfish.Logout
Sleep 30
Redfish.Login ${LDAP_USER} ${LDAP_USER_PASSWORD}
Verify SNMP Works When Eth1 IP Is Not Configured
[Documentation] Verify SNMP works when eth1 IP is not configured.
[Tags] Verify_SNMP_Works_When_Eth1_IP_Is_Not_Configured
[Setup] Run Keywords Redfish.Login AND
... Set Test Variable ${CHANNEL_NUMBER} ${SECONDARY_CHANNEL_NUMBER}
... AND Delete IP Address ${OPENBMC_HOST_1}
[Teardown] Add IP Address ${OPENBMC_HOST_1} ${eth1_subnet_mask} ${eth1_gateway}
Create Error On BMC And Verify Trap
Disable And Enable Eth0 Interface
[Documentation] Disable and Enable eth0 ethernet interface via redfish.
[Tags] Disable_And_Enable_Eth0_Interface
[Template] Set BMC Ethernet Interfaces State
# interface_ip interface enabled
${OPENBMC_HOST} eth0 ${False}
${OPENBMC_HOST} eth0 ${True}
Verify Both Interfaces Access Concurrently Via Redfish
[Documentation] Verify both interfaces access conurrently via redfish.
[Tags] Verify_Both_Interfaces_Access_Concurrently_Via_Redfish
${dict}= Execute Process Multi Keyword ${2}
... Redfish.patch ${REDFISH_NW_ETH_IFACE}eth0 body={'DHCPv4':{'UseDNSServers':${True}}}
... Redfish1.patch ${REDFISH_NW_ETH_IFACE}eth1 body={'DHCPv4':{'UseDNSServers':${True}}}
Dictionary Should Not Contain Value ${dict} False
... msg=One or more operations has failed.
${resp}= Redfish.Get ${REDFISH_NW_ETH_IFACE}eth0
${resp1}= Redfish1.Get ${REDFISH_NW_ETH_IFACE}eth1
Should Be Equal ${resp.dict["DHCPv4"]['UseDNSServers']} ${True}
Should Be Equal ${resp1.dict["DHCPv4"]['UseDNSServers']} ${True}
Able To Access Serial Console Via Both Network Interfaces
[Documentation] Able to access serial console via both network interfaces.
[Tags] Able_To_Access_Serial_Console_Via_Both_Network_Interfaces
Open Connection And Log In host=${OPENBMC_HOST} port=2200
Open Connection And Log In host=${OPENBMC_HOST_1} port=2200
Close All Connections
Verify IPMI Works On Both Network Interfaces
[Documentation] Verify IPMI works on both network interfaces.
[Tags] Verify_IPMI_Works_On_Both_Network_Interfaces
Run IPMI ${OPENBMC_HOST_1} power on
${status1}= Run IPMI ${OPENBMC_HOST} power status
${status2}= Run IPMI ${OPENBMC_HOST_1} power status
Should Be Equal ${status1} ${status2}
Verify Modifying IP Address Multiple Times On Interface
[Documentation] Verify modifying IP address multiple times on interface.
[Tags] Verify_Modifying_IP_Address_Multiple_Times_On_Interface
[Teardown] Run Keywords
... Delete IP Address ${test_ipv4_addr} AND Redfish.Logout
${test_gateway}= Get BMC Default Gateway
Add IP Address ${test_ipv4_addr} ${test_subnet_mask} ${test_gateway}
Update IP Address ${test_ipv4_addr} ${test_ipv4_addr2} ${test_subnet_mask} ${test_gateway}
Update IP Address ${test_ipv4_addr2} ${test_ipv4_addr} ${test_subnet_mask} ${test_gateway}
Run Keyword Wait For Host To Ping ${OPENBMC_HOST} ${NETWORK_TIMEOUT}
Run Keyword Wait For Host To Ping ${OPENBMC_HOST_1} ${NETWORK_TIMEOUT}
Verify Able To Load Certificates Via Eth1 IP Address
[Documentation] Verify able to load certificates via eth1 IP address.
[Tags] Verify_Able_To_Load_Certificates_Via_Eth1_IP_Address
[Template] Install Certificate Via Redfish And Verify
# cert_type cert_format expected_status
CA Valid Certificate ok
Client Valid Certificate Valid Privatekey ok
Enable SSH Protocol Via Eth1 And Verify On Both Interfaces
[Documentation] Enable SSH protocol via eth1 and verify on both interfaces.
[Tags] Enable_SSH_Protocol_Via_Eth1_And_Verify_On_Both_Interfaces
Set SSH Value Via Eth1 ${True}
# Check if SSH is really enabled via Redfish via eth1.
Verify SSH Protocol State Via Eth1 ${True}
# Check if SSH login and commands on SSH session work on both interfaces.
Verify SSH Login And Commands Work
Verify SSH Login And Commands Work ${OPENBMC_HOST_1}
Disable SSH Protocol Via Eth1 And Verify On Both Interfaces
[Documentation] Disable SSH protocol via eth1 and verify on both interfaces.
[Tags] Disable_SSH_Protocol_Via_Eth1_And_Verify_On_Both_Interfaces
[Teardown] Set SSH Value Via Eth1 ${True}
Set SSH Value Via Eth1 ${False}
# Check if SSH is really disabled via Redfish via eth1.
Verify SSH Protocol State Via Eth1 ${False}
# Check if SSH login and commands fail on eth1.
${status}= Run Keyword And Return Status
... Verify SSH Login And Commands Work ${OPENBMC_HOST_1}
Should Be Equal As Strings ${status} False
... msg=SSH Login and commands are working after disabling SSH via eth1.
# Check if SSH login and commands fail.
${status}= Run Keyword And Return Status
... Verify SSH Login And Commands Work
Should Be Equal As Strings ${status} False
... msg=SSH Login and commands are working after disabling SSH.
*** Keywords ***
Get Network Configuration Using Channel Number
[Documentation] Get ethernet interface.
[Arguments] ${channel_number}
# Description of argument(s):
# channel_number Ethernet channel number, 1 is for eth0 and 2 is for eth1 (e.g. "1").
${active_channel_config}= Get Active Channel Config
${ethernet_interface}= Set Variable ${active_channel_config['${channel_number}']['name']}
${resp}= Redfish.Get ${REDFISH_NW_ETH_IFACE}${ethernet_interface}
@{network_configurations}= Get From Dictionary ${resp.dict} IPv4StaticAddresses
RETURN @{network_configurations}
Suite Setup Execution
[Documentation] Do suite setup task.
Valid Value OPENBMC_HOST_1
# Check both interfaces are configured and reachable.
Ping Host ${OPENBMC_HOST}
Ping Host ${OPENBMC_HOST_1}
${network_configurations}= Get Network Configuration Using Channel Number ${SECONDARY_CHANNEL_NUMBER}
FOR ${network_configuration} IN @{network_configurations}
Run Keyword If '${network_configuration['Address']}' == '${OPENBMC_HOST_1}'
... Run Keywords Set Suite Variable ${eth1_subnet_mask} ${network_configuration['SubnetMask']}
... AND Set Suite Variable ${eth1_gateway} ${network_configuration['Gateway']}
... AND Exit For Loop
END
Set BMC Ethernet Interfaces State
[Documentation] Set BMC ethernet interface state.
[Arguments] ${interface_ip} ${interface} ${enabled}
[Teardown] Redfish1.Logout
# Description of argument(s):
# interface_ip IP address of ethernet interface.
# interface The ethernet interface name (eg. eth0 or eth1).
# enabled Indicates interface should be enabled (eg. True or False).
Redfish1.Login
${data}= Create Dictionary InterfaceEnabled=${enabled}
Redfish1.patch ${REDFISH_NW_ETH_IFACE}${interface} body=&{data}
... valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}]
Sleep ${NETWORK_TIMEOUT}s
${interface_status}= Redfish1.Get Attribute ${REDFISH_NW_ETH_IFACE}${interface} InterfaceEnabled
Should Be Equal ${interface_status} ${enabled}
${status}= Run Keyword And Return Status Ping Host ${interface_ip}
Run Keyword If ${enabled} == ${True} Should Be Equal ${status} ${True}
... ELSE Should Be Equal ${status} ${False}
Run IPMI
[Documentation] Run IPMI command.
[Arguments] ${host} ${sub_cmd}
# Description of argument(s):
# host BMC host name or IP address.
# sub_cmd The IPMI command string to be executed.
${rc} ${output}= Run And Return Rc And Output ${cmd_prefix} -H ${host} ${sub_cmd}
Should Be Equal As Strings ${rc} 0
RETURN ${output}
Install Certificate Via Redfish And Verify
[Documentation] Install and verify certificate using Redfish.
[Arguments] ${cert_type} ${cert_format} ${expected_status} ${delete_cert}=${True}
[Teardown] Remove Directory certificate_dir recursive=True
# Description of argument(s):
# cert_type Certificate type (e.g. "Client" or "CA").
# cert_format Certificate file format
# (e.g. "Valid_Certificate_Valid_Privatekey").
# expected_status Expected status of certificate replace Redfish
# request (i.e. "ok" or "error").
# delete_cert Certificate will be deleted before installing if this True.
Create Directory certificate_dir
# AUTH_URI is a global variable defined in lib/resource.robot
Set Test Variable ${AUTH_URI} https://${OPENBMC_HOST_1}
Run Keyword If '${cert_type}' == 'CA' and '${delete_cert}' == '${True}'
... Delete All CA Certificate Via Redfish
... ELSE IF '${cert_type}' == 'Client' and '${delete_cert}' == '${True}'
... Delete Certificate Via BMC CLI ${cert_type}
${cert_file_path}= Generate Certificate File Via Openssl ${cert_format}
${bytes}= OperatingSystem.Get Binary File ${cert_file_path}
${file_data}= Decode Bytes To String ${bytes} UTF-8
${certificate_uri}= Set Variable If
... '${cert_type}' == 'Client' ${REDFISH_LDAP_CERTIFICATE_URI}
... '${cert_type}' == 'CA' ${REDFISH_CA_CERTIFICATE_URI}
${cert_id}= Install Certificate File On BMC ${certificate_uri} ${expected_status} data=${file_data}
Logging Installed certificate id: ${cert_id}
Sleep 30s
${cert_file_content}= OperatingSystem.Get File ${cert_file_path}
${bmc_cert_content}= Run Keyword If '${expected_status}' == 'ok' redfish_utils.Get Attribute
... ${certificate_uri}/${cert_id} CertificateString
Run Keyword If '${expected_status}' == 'ok' Should Contain ${cert_file_content} ${bmc_cert_content}
RETURN ${cert_id}
Set SSH Value Via Eth1
[Documentation] Enable or disable SSH protocol via Eth1.
[Arguments] ${enable_value}=${True}
# Description of argument(s}:
# enable_value Enable or disable SSH, e.g. (true, false).
${ssh_state}= Create Dictionary ProtocolEnabled=${enable_value}
${data}= Create Dictionary SSH=${ssh_state}
Redfish1.Login
Redfish1.patch ${REDFISH_NW_PROTOCOL_URI} body=&{data}
... valid_status_codes=[${HTTP_NO_CONTENT}]
# Wait for timeout for new values to take effect.
Sleep ${NETWORK_TIMEOUT}s
Verify SSH Protocol State Via Eth1
[Documentation] Verify SSH protocol state via eth1.
[Arguments] ${state}=${True}
# Description of argument(s}:
# state Enable or disable SSH, e.g. (true, false)
${resp}= Redfish1.Get ${REDFISH_NW_PROTOCOL_URI}
Should Be Equal As Strings ${resp.dict['SSH']['ProtocolEnabled']} ${state}
... msg=Protocol states are not matching.