1*** Settings ***
2Documentation   Test BMC DHCP multiple network interface functionalities.
3                ...  Run on setup eth0 in static and eth1 in DHCP.
4
5Resource        ../../lib/resource.robot
6Resource        ../../lib/common_utils.robot
7Resource        ../../lib/connection_client.robot
8Resource        ../../lib/bmc_network_utils.robot
9Resource        ../../lib/openbmc_ffdc.robot
10
11Suite Setup     Suite Setup Execution
12Test Teardown   FFDC On Test Case Fail
13Suite Teardown  Redfish.Logout
14
15*** Variables ***
16
17&{DHCP_ENABLED}           DHCPEnabled=${True}
18&{DHCP_DISABLED}          DHCPEnabled=${False}
19&{ENABLE_DHCP}            DHCPv4=${DHCP_ENABLED}
20&{DISABLE_DHCP}           DHCPv4=${DHCP_DISABLED}
21${ethernet_interface}     eth1
22
23&{dns_enable_dict}                 UseDNSServers=${True}
24&{dns_disable_dict}                UseDNSServers=${False}
25&{ntp_enable_dict}                 UseNTPServers=${True}
26&{ntp_disable_dict}                UseNTPServers=${False}
27&{domain_name_enable_dict}         UseDomainName=${True}
28&{domain_name_disable_dict}        UseDomainName=${False}
29&{enable_multiple_properties}      UseDomainName=${True}
30...                                UseNTPServers=${True}
31...                                UseDNSServers=${True}
32&{disable_multiple_properties}     UseDomainName=${False}
33...                                UseNTPServers=${False}
34...                                UseDNSServers=${False}
35
36Force Tags                         Multiple_Interfaces_DHCP
37
38*** Test Cases ***
39
40Disable DHCP On Eth1 And Verify System Is Accessible By Eth0
41    [Documentation]  Disable DHCP on eth1 using Redfish and verify
42    ...              if system is accessible by eth0.
43    [Tags]  Disable_DHCP_On_Eth1_And_Verify_System_Is_Accessible_By_Eth0
44    [Teardown]  Set DHCPEnabled To Enable Or Disable  True  eth1
45
46    Set DHCPEnabled To Enable Or Disable  False  eth1
47    ${DHCPEnabled}=  Get IPv4 DHCP Enabled Status
48    Should Be Equal  ${DHCPEnabled}  ${False}
49    Wait For Host To Ping  ${OPENBMC_HOST}  ${NETWORK_TIMEOUT}
50
51Enable DHCP On Eth1 And Verify System Is Accessible By Eth0
52    [Documentation]  Enable DHCP on eth1 using Redfish and verify if system
53    ...              is accessible by eth0.
54    [Tags]  Enable_DHCP_On_Eth1_And_Verify_System_Is_Accessible_By_Eth0
55    [Setup]  Set DHCPEnabled To Enable Or Disable  False  eth1
56
57    Set DHCPEnabled To Enable Or Disable  True  eth1
58    ${DHCPEnabled}=  Get IPv4 DHCP Enabled Status
59    Should Be Equal  ${DHCPEnabled}  ${True}
60    Wait For Host To Ping  ${OPENBMC_HOST}  ${NETWORK_TIMEOUT}
61
62Set Network Property via Redfish And Verify
63   [Documentation]  Set network property via Redfish and verify.
64   [Tags]  Set_Network_Property_via_Redfish_And_Verify
65   [Teardown]  Restore Configuration
66   [Template]  Apply DHCP Config
67
68    # property
69    ${dns_enable_dict}
70    ${dns_disable_dict}
71    ${domain_name_enable_dict}
72    ${domain_name_disable_dict}
73    ${ntp_enable_dict}
74    ${ntp_disable_dict}
75    ${enable_multiple_properties}
76    ${disable_multiple_properties}
77
78Enable DHCP On Eth1 And Check No Impact On Eth0
79    [Documentation]  Enable DHCP On Eth1 And Check No Impact On Eth0.
80    [Tags]  Enable_DHCP_On_Eth1_And_Check_No_Impact_On_Eth0
81    [Setup]  Set DHCPEnabled To Enable Or Disable  False  eth1
82
83    # Getting the eth0 details before enabling DHCP.
84    ${ip_data_before}=  Get BMC IP Info
85
86    # Enable DHCP on eth1.
87    Set DHCPEnabled To Enable Or Disable  True  eth1
88
89    # Check the value of DHCPEnabled on eth0 is not impacted.
90    ${DHCPEnabled}=  Get IPv4 DHCP Enabled Status
91    Should Be Equal  ${DHCPEnabled}  ${False}
92
93    # Getting eth0 details after enabling DHCP.
94    ${ip_data_after}=  Get BMC IP Info
95
96    # Before and after IP details must match.
97    Should Be Equal  ${ip_data_before}  ${ip_data_after}
98
99Switch Between DHCP And Static
100    [Documentation]  Switch between DHCP and static.
101    [Tags]  Switch_Between_DHCP_And_Static
102    [Teardown]  Set DHCPEnabled To Enable Or Disable  True  eth1
103
104    # Fetch the IP details before.
105    ${ip_addr_before}  ${gateway_before}  ${subnetmask_before}  Get DHCP IP Info
106
107    # Switch Between Static and DHCP.
108    FOR  ${i}  IN RANGE  ${10}
109      Set DHCPEnabled To Enable Or Disable  False  eth1
110      Set DHCPEnabled To Enable Or Disable  True  eth1
111    END
112    Sleep  5s
113
114    # Fetch the IP details after.
115    ${ip_addr_after}  ${gateway_after}  ${subnetmask_after}  Get DHCP IP Info
116
117    # DHCP Details must be the same before and after.
118    Should Be Equal  ${ip_addr_before}  ${ip_addr_after}
119    Should Be Equal  ${gateway_before}  ${gateway_after}
120    Should Be Equal  ${subnetmask_before}  ${subnetmask_after}
121
122*** Keywords ***
123
124Set DHCPEnabled To Enable Or Disable
125    [Documentation]  Enable or Disable DHCP on the interface.
126    [Arguments]  ${dhcp_enabled}=${False}  ${interface}=${ethernet_interface}
127    ...          ${valid_status_code}=[${HTTP_OK},${HTTP_ACCEPTED}]
128
129    # Description of argument(s):
130    # dhcp_enabled        False for disabling DHCP and True for Enabling DHCP.
131    # interface           eth0 or eth1. Default is eth1.
132    # valid_status_code   Expected valid status code from Patch request.
133    #                     Default is HTTP_OK.
134
135    ${data}=  Set Variable If  ${dhcp_enabled} == ${False}  ${DISABLE_DHCP}  ${ENABLE_DHCP}
136    ${resp}=  Redfish.Patch
137    ...  /redfish/v1/Managers/${MANAGER_ID}/EthernetInterfaces/${interface}
138    ...  body=${data}  valid_status_codes=${valid_status_code}
139
140Apply DHCP Config
141    [Documentation]  Apply DHCP Config
142    [Arguments]  ${property}
143
144    # Description of Argument(s):
145    # property  DHCP property values.
146
147    ${active_channel_config}=  Get Active Channel Config
148    Redfish.Patch
149    ...  /redfish/v1/Managers/${MANAGER_ID}/EthernetInterfaces/${active_channel_config['${CHANNEL_NUMBER}']['name']}/
150    ...  body={"DHCPv4":${property}}  valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}]
151
152    ${resp}=  Redfish.Get
153    ...  /redfish/v1/Managers/${MANAGER_ID}/EthernetInterfaces/${active_channel_config['${CHANNEL_NUMBER}']['name']}
154    Verify Ethernet Config Property  ${property}  ${resp.dict["DHCPv4"]}
155
156
157Verify Ethernet Config Property
158    [Documentation]  verify ethernet config properties.
159    [Arguments]  ${property}  ${response_data}
160
161    # Description of argument(s):
162    # ${property}       DHCP Properties in dictionary.
163    # Example:
164    # property         value
165    # DHCPEnabled      :False
166    # UseDomainName    :True
167    # UseNTPServers    :True
168    # UseDNSServers    :True
169    # ${response_data}  DHCP Response data in dictionary.
170    # Example:
171    # property         value
172    # DHCPEnabled      :False
173    # UseDomainName    :True
174    # UseNTPServers    :True
175    # UseDNSServers    :True
176
177   ${key_map}=  Get Dictionary Items  ${property}
178   FOR  ${key}  ${value}  IN  @{key_map}
179      Should Be Equal As Strings  ${response_data['${key}']}  ${value}
180   END
181
182Restore Configuration
183    [Documentation]  Restore the configuration to Both Static Network
184
185    Run Keyword If  '${CHANNEL_NUMBER}' == '1'  Add IP Address  ${OPENBMC_HOST}  ${eth0_subnet_mask}  ${eth0_gateway}
186    ...  ELSE IF  '${CHANNEL_NUMBER}' == '2'  Add IP Address  ${OPENBMC_HOST_1}  ${eth1_subnet_mask}  ${eth1_gateway}
187
188Get Network Configuration Using Channel Number
189    [Documentation]  Get ethernet interface.
190    [Arguments]  ${channel_number}
191
192    # Description of argument(s):
193    # channel_number   Ethernet channel number, 1 is for eth0 and 2 is for eth1 (e.g. "1").
194
195    ${active_channel_config}=  Get Active Channel Config
196    ${ethernet_interface}=  Set Variable  ${active_channel_config['${channel_number}']['name']}
197    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}
198
199    @{network_configurations}=  Get From Dictionary  ${resp.dict}  IPv4StaticAddresses
200    [Return]  @{network_configurations}
201
202Suite Setup Execution
203    [Documentation]  Do suite setup task.
204
205    Ping Host  ${OPENBMC_HOST}
206    Redfish.Login
207
208    # Get the configuration of eth1
209    ${network_configurations}=  Get Network Configuration Using Channel Number  ${2}
210    FOR  ${network_configuration}  IN  @{network_configurations}
211      Run Keyword If  '${network_configuration['Address']}' == '${OPENBMC_HOST_1}'
212      ...  Run Keywords  Set Suite Variable  ${eth1_subnet_mask}  ${network_configuration['SubnetMask']}
213      ...  AND  Set Suite Variable  ${eth1_gateway}  ${network_configuration['Gateway']}
214      ...  AND  Exit For Loop
215    END
216
217    # Get the configuration of eth0
218    ${network_configurations}=  Get Network Configuration Using Channel Number  ${1}
219    FOR  ${network_configuration}  IN  @{network_configurations}
220      Run Keyword If  '${network_configuration['Address']}' == '${OPENBMC_HOST}'
221      ...  Run Keywords  Set Suite Variable  ${eth0_subnet_mask}  ${network_configuration['SubnetMask']}
222      ...  AND  Set Suite Variable  ${eth0_gateway}  ${network_configuration['Gateway']}
223      ...  AND  Exit For Loop
224    END
225