1*** Settings ***
2Documentation   Test BMC multiple network interface functionalities.
3
4# User input BMC IP for the eth1.
5# Use can input as  -v OPENBMC_HOST_1:xx.xxx.xx from command line.
6Library         ../../lib/bmc_redfish.py  https://${OPENBMC_HOST_1}:${HTTPS_PORT}
7...             ${OPENBMC_USERNAME}  ${OPENBMC_PASSWORD}  WITH NAME  Redfish1
8
9Resource        ../../lib/resource.robot
10Resource        ../../lib/common_utils.robot
11Resource        ../../lib/connection_client.robot
12Resource        ../../lib/bmc_network_utils.robot
13Resource        ../../lib/openbmc_ffdc.robot
14Resource        ../../lib/bmc_ldap_utils.robot
15Resource        ../../lib/snmp/resource.robot
16Resource        ../../lib/snmp/redfish_snmp_utils.robot
17Library         ../../lib/jobs_processing.py
18
19Suite Setup     Suite Setup Execution
20Test Teardown   FFDC On Test Case Fail
21Suite Teardown  Run Keywords  Redfish1.Logout  AND  Redfish.Logout
22
23*** Variables ***
24
25${cmd_prefix}  ipmitool -I lanplus -C 17 -p 623 -U ${OPENBMC_USERNAME} -P ${OPENBMC_PASSWORD}
26
27*** Test Cases ***
28
29Verify Both Interfaces BMC IP Addresses Accessible Via SSH
30    [Documentation]  Verify both interfaces (eth0, eth1) BMC IP addresses accessible via SSH.
31    [Tags]  Verify_Both_Interfaces_BMC_IP_Addresses_Accessible_Via_SSH
32
33    Open Connection And Log In  ${OPENBMC_USERNAME}  ${OPENBMC_PASSWORD}  host=${OPENBMC_HOST}
34    Open Connection And Log In  ${OPENBMC_USERNAME}  ${OPENBMC_PASSWORD}  host=${OPENBMC_HOST_1}
35    Close All Connections
36
37
38Verify Redfish Works On Both Interfaces
39    [Documentation]  Verify access BMC with both interfaces (eth0, eth1) IP addresses via Redfish.
40    [Tags]  Verify_Redfish_Works_On_Both_Interfaces
41    [Teardown]  Run Keywords
42    ...  Configure Hostname  ${hostname}  AND  Validate Hostname On BMC  ${hostname}
43
44    Redfish1.Login
45    Redfish.Login
46
47    ${hostname}=  Redfish.Get Attribute  ${REDFISH_NW_PROTOCOL_URI}  HostName
48    ${data}=  Create Dictionary  HostName=openbmc
49    Redfish1.patch  ${REDFISH_NW_ETH_IFACE}eth1  body=&{data}
50    ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}]
51
52    Validate Hostname On BMC  openbmc
53
54    ${resp1}=  Redfish.Get  ${REDFISH_NW_ETH_IFACE}eth0
55    ${resp2}=  Redfish1.Get  ${REDFISH_NW_ETH_IFACE}eth1
56    Should Be Equal  ${resp1.dict['HostName']}  ${resp2.dict['HostName']}
57
58
59Verify LDAP Login Works When Eth1 IP Is Not Configured
60    [Documentation]  Verify LDAP login works when eth1 IP is erased.
61    [Tags]  Verify_LDAP_Login_Works_When_Eth1_IP_Is_Not_Configured
62    [Setup]  Run Keywords  Set Test Variable  ${CHANNEL_NUMBER}  ${2}
63    ...  AND  Delete IP Address  ${OPENBMC_HOST_1}
64    [Teardown]  Run Keywords  Redfish.Login  AND
65    ...  Add IP Address  ${OPENBMC_HOST_1}  ${eth1_subnet_mask}  ${eth1_gateway}
66
67    Create LDAP Configuration
68    Redfish.Login  ${LDAP_USER}  ${LDAP_USER_PASSWORD}
69    Redfish.Logout
70
71
72Verify SNMP Works When Eth1 IP Is Not Configured
73    [Documentation]  Verify SNMP works when eth1 IP is not configured.
74    [Tags]  Verify_SNMP_Works_When_Eth1_IP_Is_Not_Configured
75    [Setup]  Run Keywords  Set Test Variable  ${CHANNEL_NUMBER}  ${2}
76    ...  AND  Delete IP Address  ${OPENBMC_HOST_1}
77    [Teardown]  Run Keywords  Redfish.Login  AND
78    ...  Add IP Address  ${OPENBMC_HOST_1}  ${eth1_subnet_mask}  ${eth1_gateway}
79
80    Create Error On BMC And Verify Trap
81
82
83Disable And Enable Eth0 Interface
84    [Documentation]  Disable and Enable eth0 ethernet interface via redfish.
85    [Tags]  Disable_And_Enable_Eth0_Interface
86    [Template]  Set BMC Ethernet Interfaces State
87
88    # interface_ip   interface  enabled
89    ${OPENBMC_HOST}   eth0      ${False}
90    ${OPENBMC_HOST}   eth0      ${True}
91
92
93Verify Both Interfaces Access Concurrently Via Redfish
94    [Documentation]  Verify both interfaces access conurrently via redfish.
95    [Tags]  Verify_Both_Interfaces_Access_Concurrently_Via_Redfish
96
97    Redfish.Login
98    Redfish1.Login
99
100    ${dict}=  Execute Process Multi Keyword  ${2}
101    ...  Redfish.Patch ${REDFISH_NW_ETH_IFACE}eth0 body={'DHCPv4':{'UseDNSServers':${True}}}
102    ...  Redfish1.Patch ${REDFISH_NW_ETH_IFACE}eth1 body={'DHCPv4':{'UseDNSServers':${True}}}
103
104    Dictionary Should Not Contain Value  ${dict}  False
105    ...  msg=One or more operations has failed.
106
107    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH_IFACE}eth0
108    ${resp1}=  Redfish1.Get  ${REDFISH_NW_ETH_IFACE}eth1
109
110    Should Be Equal  ${resp.dict["DHCPv4"]['UseDNSServers']}  ${True}
111    Should Be Equal  ${resp1.dict["DHCPv4"]['UseDNSServers']}  ${True}
112
113
114Able To Access Serial Console Via Both Network Interfaces
115    [Documentation]  Able to access serial console via both network interfaces.
116    [Tags]  Able_To_Access_Serial_Console_Via_Both_Network Interfaces
117
118    Open Connection And Log In  host=${OPENBMC_HOST}  port=2200
119    Open Connection And Log In  host=${OPENBMC_HOST_1}  port=2200
120    Close All Connections
121
122
123Verify IPMI Works On Both Network Interfaces
124    [Documentation]  Verify IPMI works on both network interfaces.
125    [Tags]  Verify_IPMI_Works_On_Both_Network_Interfaces
126
127    Run IPMI  ${OPENBMC_HOST_1}  power on
128    ${status1}=  Run IPMI  ${OPENBMC_HOST}  power status
129    ${status2}=  Run IPMI  ${OPENBMC_HOST_1}  power status
130    Should Be Equal  ${status1}  ${status2}
131
132*** Keywords ***
133
134Get Network Configuration Using Channel Number
135    [Documentation]  Get ethernet interface.
136    [Arguments]  ${channel_number}
137
138    # Description of argument(s):
139    # channel_number   Ethernet channel number, 1 is for eth0 and 2 is for eth1 (e.g. "1").
140
141    ${active_channel_config}=  Get Active Channel Config
142    ${ethernet_interface}=  Set Variable  ${active_channel_config['${channel_number}']['name']}
143    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}
144
145    @{network_configurations}=  Get From Dictionary  ${resp.dict}  IPv4StaticAddresses
146    [Return]  @{network_configurations}
147
148
149Suite Setup Execution
150    [Documentation]  Do suite setup task.
151
152    Valid Value  OPENBMC_HOST_1
153
154    # Check both interfaces are configured and reachable.
155    Ping Host  ${OPENBMC_HOST}
156    Ping Host  ${OPENBMC_HOST_1}
157
158    ${network_configurations}=  Get Network Configuration Using Channel Number  ${2}
159    FOR  ${network_configuration}  IN  @{network_configurations}
160
161      Run Keyword If  '${network_configuration['Address']}' == '${OPENBMC_HOST_1}'
162      ...  Run Keywords  Set Suite Variable  ${eth1_subnet_mask}  ${network_configuration['SubnetMask']}
163      ...  AND  Set Suite Variable  ${eth1_gateway}  ${network_configuration['Gateway']}
164      ...  AND  Exit For Loop
165
166    END
167
168
169Set BMC Ethernet Interfaces State
170    [Documentation]  Set BMC ethernet interface state.
171    [Arguments]  ${interface_ip}  ${interface}  ${enabled}
172    [Teardown]  Redfish1.Logout
173
174    # Description of argument(s):
175    # interface_ip    IP address of ethernet interface.
176    # interface       The ethernet interface name (eg. eth0 or eth1).
177    # enabled         Indicates interface should be enabled (eg. True or False).
178
179    Redfish1.Login
180
181    ${data}=  Create Dictionary  InterfaceEnabled=${enabled}
182
183    Redfish1.patch  ${REDFISH_NW_ETH_IFACE}${interface}  body=&{data}
184    ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}]
185
186    Sleep  ${NETWORK_TIMEOUT}s
187    ${interface_status}=   Redfish1.Get Attribute  ${REDFISH_NW_ETH_IFACE}${interface}  InterfaceEnabled
188    Should Be Equal  ${interface_status}  ${enabled}
189
190    ${status}=  Run Keyword And Return Status  Ping Host  ${interface_ip}
191
192    Run Keyword If  ${enabled} == ${True}  Should Be Equal  ${status}  ${True}
193    ...  ELSE  Should Be Equal  ${status}  ${False}
194
195
196Run IPMI
197    [Documentation]  Run IPMI command.
198    [Arguments]  ${host}  ${sub_cmd}
199
200    # Description of argument(s):
201    # host         BMC host name or IP address.
202    # sub_cmd      The IPMI command string to be executed.
203
204    ${rc}  ${output}=  Run And Return Rc And Output  ${cmd_prefix} -H ${host} ${sub_cmd}
205    Should Be Equal As Strings  ${rc}  0
206    [Return]  ${output}
207
208