1*** Settings ***
2
3Documentation    VMI static/dynamic IP config and certificate exchange tests.
4
5Resource         ../../lib/resource.robot
6Resource         ../../lib/bmc_redfish_resource.robot
7Resource         ../../lib/openbmc_ffdc.robot
8Library          ../../lib/bmc_network_utils.py
9
10Suite Setup       Redfish.Login
11Test Teardown     FFDC On Test Case Fail
12Suite Teardown    Redfish.Logout
13
14*** Variables ***
15
16${test_ipv4}              10.10.20.30
17${test_gateway}           0.0.0.0
18${test_netmask}           255.255.252.0
19&{DHCP_ENABLED}           DHCPEnabled=${${True}}
20&{DHCP_DISABLED}          DHCPEnabled=${${False}}
21
22&{ENABLE_DHCP}            DHCPv4=&{DHCP_ENABLED}
23&{DISABLE_DHCP}           DHCPv4=&{DHCP_DISABLED}
24
25
26*** Test Cases ***
27
28Verify All VMI EthernetInterfaces
29    [Documentation]  Verify all VMI ethernet interfaces.
30    [Tags]  Verify_All_VMI_EthernetINterfaces
31
32    Verify VMI EthernetInterfaces
33
34
35Verify Existing VMI Network Interface Details
36    [Documentation]  Verify existing VMI network interface details.
37    [Tags]  Verify_VMI_Network_Interface_Details
38
39    ${vmi_ip}=  Get VMI Network Interface Details
40    ${origin}=  Set Variable If  ${vmi_ip["DHCPv4"]} == ${False}  Static  DHCP
41
42    Should Not Be Equal  ${vmi_ip["DHCPv4"]}  ${vmi_ip["IPv4StaticAddresses"]}
43    Should Be Equal As Strings  ${origin}  ${vmi_ip["IPv4_AddressOrigin"]}
44    Should Be Equal As Strings  ${vmi_ip["Id"]}  intf0
45    Should Be Equal As Strings  ${vmi_ip["Description"]}
46    ...  Ethernet Interface for Virtual Management Interface
47    Should Be Equal As Strings  ${vmi_ip["Name"]}  Virtual Management Interface
48    Should Be True  ${vmi_ip["InterfaceEnabled"]}
49
50
51Delete Existing Static VMI IP Address
52    [Documentation]  Delete existing static VMI IP address.
53    [Tags]  Delete_Existing_Static_VMI_IP_Address
54
55    ${curr_origin}=  Get Immediate Child Parameter From VMI Network Interface  DHCPEnabled
56    Run Keyword If  ${curr_origin} == ${True}  Set VMI IPv4 Origin  ${False}  ${HTTP_ACCEPTED}
57
58    Delete VMI IPv4 Address  IPv4StaticAddresses  valid_status_code=${HTTP_ACCEPTED}
59    ${default}=  Set Variable  0.0.0.0
60    Verify VMI Network Interface Details  ${default}  Static  ${default}  ${default}  ${True}
61
62
63Verify User Cannot Delete ReadOnly Property IPv4Addresses
64    [Documentation]  Verify user cannot delete readonly property IPv4Addresses.
65    [Tags]  Verify_User_Cannot_Delete_ReadOnly_Property_IPv4Addresses
66
67    ${curr_origin}=  Get Immediate Child Parameter From VMI Network Interface  DHCPEnabled
68    Run Keyword If  ${curr_origin} == ${False}  Set VMI IPv4 Origin  ${True}  ${HTTP_ACCEPTED}
69    Delete VMI IPv4 Address  IPv4Addresses  valid_status_code=${HTTP_BAD_REQUEST}
70
71
72Assign Valid And Invalid Static IPv4 Address To VMI
73    [Documentation]  Assign static IPv4 address to VMI.
74    [Tags]  Assign_Valid_And_Invalid_Static_IPv4_Address_To_VMI
75    [Template]  Verify Assigning Static IPv4 Address To VMI
76    [Teardown]  Delete VMI IPv4 Address  IPv4Addresses  ${HTTP_ACCEPTED}
77
78    # ip          gateway     netmask          del_curr_ip   host_reboot   valid_status_code
79    10.5.20.30    0.0.0.0     255.255.252.0    ${False}      ${True}       ${HTTP_ACCEPTED}
80    a.3.118.94    0.0.0.0     255.255.252.0    ${False}      ${False}      ${HTTP_BAD_REQUEST}
81
82Add Multiple IP Addreses On VMI Interface And Verify
83    [Documentation]  Add multiple IP addreses on VMI interface and verify.
84    [Tags]  Add_Multiple_IP_Addreses_On_VMI_Interface_And_Verify
85    [Teardown]  Run Keywords  Delete VMI IPv4 Address  IPv4Addresses  AND  Test Teardown
86
87    ${ip1}=  Create dictionary  Address=10.5.5.10  SubnetMask=255.255.252.0  Gateway=0.0.0.0
88    ${ip2}=  Create dictionary  Address=10.5.5.11  SubnetMask=255.255.252.0  Gateway=0.0.0.0
89    ${ip3}=  Create dictionary  Address=10.5.5.12  SubnetMask=255.255.252.0  Gateway=0.0.0.0
90    ${ips}=  Create List  ${ip1}  ${ip2}  ${ip3}
91
92    ${active_channel_config}=  Get Active Channel Config
93    Redfish.Patch  /redfish/v1/Systems/hypervisor/EthernetInterfaces/${active_channel_config['${CHANNEL_NUMBER}']['name']}
94    ...  body={'IPv4StaticAddresses':${ips}}  valid_status_codes=[${HTTP_ACCEPTED}]
95    Verify VMI Network Interface Details   ${ip1["Address"]}  Static  ${ip1["Gateway"]}  ${ip1["SubnetMask"]}  ${True}
96
97Modify IP Addresses On VMI Interface And Verify
98    [Documentation]  Modify IP addresses on VMI interface and verify.
99    [Tags]  Modify_IP_Addresses_On_VMI_Interface_And_Verify
100    [Template]  Verify Assigning Static IPv4 Address To VMI
101    [Teardown]  Run keywords  Delete VMI IPv4 Address  IPv4Addresses  AND  Test Teardown
102
103    # ip        gateway       netmask          del_curr_ip    host_reboot        valid_status_code
104    10.5.5.10   0.0.0.0     255.255.252.0       ${False}       ${True}            ${HTTP_ACCEPTED}
105    10.5.5.11   0.0.0.0     255.255.252.0       ${False}       ${True}            ${HTTP_ACCEPTED}
106
107Switch Between IP Origins On VMI And Verify Details
108    [Documentation]  Switch between IP origins on VMI and verify details.
109    [Tags]  Switch_Between_IP_Origins_On_VMI_And_Verify_Details
110
111    Switch VMI IPv4 Origin And Verify Details
112    Switch VMI IPv4 Origin And Verify Details
113
114
115Verify Persistency Of VMI IPv4 Details After Host Reboot
116    [Documentation]  Verify persistency of VMI IPv4 details after host reboot.
117    [Tags]  Verify_Persistency_Of_VMI_IPv4_Details_After_Host_Reboot
118
119    # Verifying persistency of dynamic address.
120    Set VMI IPv4 Origin  ${True}  ${HTTP_ACCEPTED}
121    ${default}=  Set Variable  0.0.0.0
122    Verify VMI Network Interface Details  ${default}  DHCP  ${default}  ${default}  ${True}
123    Verify VMI Network Interface Details  ${default}  DHCP  ${default}  ${default}  ${True}
124
125    # Verifying persistency of static address.
126    Switch VMI IPv4 Origin And Verify Details  ${True}
127    Verify Assigning Static IPv4 Address To VMI  ${VMI_IP}  ${VMI_GATEWAY}  ${VMI_NETMASK}  ${False}
128    Verify VMI Network Interface Details  ${VMI_IP}  Static  ${VMI_GATEWAY}  ${VMI_NETMASK}  ${True}
129
130
131Delete VMI Static IP Address And Verify
132   [Documentation]  Delete VMI static IP address and verify.
133   [Tags]  Delete_VMI_Static_IP_Address_And_Verify
134
135   Set Static IPv4 Address To VMI  10.10.20.30  0.0.0.0  255.255.252.0
136   Verify VMI Network Interface Details  10.10.20.30  Static  0.0.0.0  255.255.252.0  ${True}
137   Delete VMI IPv4 Address  IPv4Addresses  ${HTTP_ACCEPTED}
138   ${active_channel_config}=  Get Active Channel Config
139   ${resp}=  Redfish.Get
140   ...  /redfish/v1/Systems/hypervisor/EthernetInterfaces/${active_channel_config['${CHANNEL_NUMBER}']['name']}
141   Should Be Empty  ${resp.dict["IPv4Addresses"]}
142
143Verify Successful VMI IP Static Configuration On HOST Boot After Session Delete
144    [Documentation]  Verify VMI IP static Configuration On HOST Boot After session deleted.
145    [Tags]  Verify_Successful_VMI_IP_Static_Configuration_On_HOST_Boot_After_Session_Delete
146    [Teardown]  Run keywords  Delete VMI IPv4 Address  IPv4Addresses  AND  Test Teardown
147
148    Set Static IPv4 Address To VMI  ${test_ipv4}  ${test_gateway}  ${test_netmask}
149
150    ${session_info}=  Get Redfish Session Info
151    Redfish.Delete  ${session_info["location"]}
152
153    # Create a new Redfish session
154    Run Keywords  Redfish Power Off  AND  Redfish Power On   AND  Redfish.Login
155
156    Verify VMI Network Interface Details  ${test_ipv4}  Static  ${test_gateway}  ${test_netmask}
157
158Verify Persistency Of VMI DHCP IP Configuration After Multiple HOST Reboots
159    [Documentation]  Verify Persistency Of VMI DHCP IP configuration After Multiple HOST Reboots
160    [Tags]  Verify_Persistency_Of_VMI_DHCP_IP_Configuration_After_Multiple_HOST_Reboots
161
162    ${LOOP_COUNT}=  Set Variable  ${3}
163    Set VMI IPv4 Origin  ${True}  ${HTTP_ACCEPTED}
164    Run Keywords  Redfish Power Off  AND  Redfish Power On
165    ${vmi_ip_config}=  Get VMI Network Interface Details
166    # Verifying persistency of dynamic address after multiple reboots.
167    Repeat Keyword  ${LOOP_COUNT} times
168    ...  Verify VMI Network Interface Details  ${vmi_ip_config["IPv4_Address"]}  DHCP  ${vmi_ip_config["IPv4_Gateway"]}
169    ...  ${vmi_ip_config["IPv4_SubnetMask"]}  ${True}
170
171Verify VMI Static IP Configuration Persist On BMC Reset Before Host Boot
172    [Documentation]  Verify VMI static IP configuration persist on BMC reset.
173    [Tags]   Verify_VMI_Static_IP_Configuration_Persist_On_BMC_Reset_Before_Host_Boot
174    [Teardown]  Run keywords  Delete VMI IPv4 Address  IPv4Addresses  AND  Test Teardown
175
176    Set Static IPv4 Address To VMI  ${test_ipv4}  ${test_gateway}  ${test_netmask}
177    Run keywords  Redfish OBMC Reboot (off)  AND  Redfish Power On
178    # Verifying the VMI static configuration
179    Verify VMI Network Interface Details  ${test_ipv4}  Static   ${test_gateway}  ${test_netmask}
180
181
182
183*** Keywords ***
184
185Get VMI Network Interface Details
186    [Documentation]  Get VMI network interface details.
187    [Arguments]  ${valid_status_code}=${HTTP_OK}
188
189    # Description of argument(s):
190    # valid_status_code  Expected valid status code from GET request.
191
192    # Note: It returns a dictionary of VMI eth0 parameters.
193
194    ${active_channel_config}=  Get Active Channel Config
195    ${resp}=  Redfish.Get
196    ...  /redfish/v1/Systems/hypervisor/EthernetInterfaces/${active_channel_config['${CHANNEL_NUMBER}']['name']}
197    ...  valid_status_codes=[${valid_status_code}]
198
199    ${ip_resp}=  Evaluate  json.loads('''${resp.text}''')  json
200
201    ${static_exists}=  Run Keyword And Ignore Error
202    ...  Set Variable  ${ip_resp["IPv4StaticAddresses"][0]["Address"]}
203    ${static_exists}=  Set Variable If  '${static_exists[0]}' == 'PASS'  ${True}  ${False}
204
205    ${vmi_ip}=  Create Dictionary  DHCPv4=${${ip_resp["DHCPv4"]["DHCPEnabled"]}}  Id=${ip_resp["Id"]}
206    ...  Description=${ip_resp["Description"]}  IPv4_Address=${ip_resp["IPv4Addresses"][0]["Address"]}
207    ...  IPv4_AddressOrigin=${ip_resp["IPv4Addresses"][0]["AddressOrigin"]}  Name=${ip_resp["Name"]}
208    ...  IPv4_Gateway=${ip_resp["IPv4Addresses"][0]["Gateway"]}
209    ...  InterfaceEnabled=${${ip_resp["InterfaceEnabled"]}}
210    ...  IPv4_SubnetMask=${ip_resp["IPv4Addresses"][0]["SubnetMask"]}  MACAddress=${ip_resp["MACAddress"]}
211    ...  IPv4StaticAddresses=${${static_exists}}
212
213    [Return]  &{vmi_ip}
214
215
216Get Immediate Child Parameter From VMI Network Interface
217    [Documentation]  Get immediate child parameter from VMI network interface.
218    [Arguments]  ${parameter}  ${valid_status_code}=${HTTP_OK}
219
220    # Description of argument(s):
221    # parameter          parameter for which value is required. Ex: DHCPEnabled, MACAddress etc.
222    # valid_status_code  Expected valid status code from GET request.
223
224    ${active_channel_config}=  Get Active Channel Config
225    ${resp}=  Redfish.Get
226    ...  /redfish/v1/Systems/hypervisor/EthernetInterfaces/${active_channel_config['${CHANNEL_NUMBER}']['name']}
227    ...  valid_status_codes=[${valid_status_code}]
228
229    ${ip_resp}=  Evaluate  json.loads('''${resp.text}''')  json
230    ${value}=  Set Variable If  '${parameter}' != 'DHCPEnabled'   ${ip_resp["${parameter}"]}
231    ...  ${ip_resp["DHCPv4"]["${parameter}"]}
232
233    [Return]  ${value}
234
235Verify VMI EthernetInterfaces
236    [Documentation]  Verify VMI ethernet interfaces.
237    [Arguments]  ${valid_status_code}=${HTTP_OK}
238
239    # Description of argument(s):
240    # valid_status_code  Expected valid status code from GET request.
241
242    ${resp}=  Redfish.Get  /redfish/v1/Systems/hypervisor/EthernetInterfaces
243    ...  valid_status_codes=[${valid_status_code}]
244
245    ${resp}=  Evaluate  json.loads('''${resp.text}''')  json
246    ${interfaces}=  Set Variable  ${resp["Members"]}
247
248    Should Be Equal As Strings  ${interfaces[0]}[@odata.id]
249    ...  /redfish/v1/Systems/hypervisor/EthernetInterfaces/eth0
250    Should Be Equal As Strings  ${interfaces[1]}[@odata.id]
251    ...  /redfish/v1/Systems/hypervisor/EthernetInterfaces/eth1
252
253    Should Be Equal  ${resp["Members@odata.count"]}  ${2}
254
255
256Verify VMI Network Interface Details
257    [Documentation]  Verify VMI network interface details.
258    [Arguments]  ${ip}  ${origin}  ${gateway}  ${netmask}
259    ...  ${host_reboot}=${False}  ${valid_status_code}=${HTTP_OK}
260
261    # Description of argument(s):
262    # ip                 VMI IPv4 address.
263    # origin             Origin of IPv4 address eg. Static or DHCP.
264    # gateway            Gateway for VMI IP.
265    # netmask            Subnetmask for VMI IP.
266    # valid_status_code  Expected valid status code from GET request. Default is HTTP_OK.
267    # host_reboot        Reboot HOST if True.
268
269    Run Keyword If  ${host_reboot} == ${True}  Run Keywords
270    ...  Redfish Power Off  AND  Redfish Power On  AND  Redfish.Login
271
272    ${vmi_ip}=  Get VMI Network Interface Details  ${valid_status_code}
273    Should Be Equal As Strings  ${origin}  ${vmi_ip["IPv4_AddressOrigin"]}
274    Should Be Equal As Strings  ${gateway}  ${vmi_ip["IPv4_Gateway"]}
275    Should Be Equal As Strings  ${netmask}  ${vmi_ip["IPv4_SubnetMask"]}
276    Should Be Equal As Strings  ${ip}  ${vmi_ip["IPv4_Address"]}
277
278Set Static IPv4 Address To VMI
279    [Documentation]  Set static IPv4 address to VMI.
280    [Arguments]  ${ip}  ${gateway}  ${netmask}  ${valid_status_code}=${HTTP_ACCEPTED}
281
282    # Description of argument(s):
283    # ip                 VMI IPv4 address.
284    # gateway            Gateway for VMI IP.
285    # netmask            Subnetmask for VMI IP.
286    # valid_status_code  Expected valid status code from GET request. Default is HTTP_ACCEPTED.
287
288    ${data}=  Set Variable
289    ...  {"IPv4StaticAddresses": [{"Address": "${ip}","SubnetMask": "${netmask}","Gateway": "${gateway}"}]}
290
291    ${active_channel_config}=  Get Active Channel Config
292    ${resp}=  Redfish.Patch
293    ...  /redfish/v1/Systems/hypervisor/EthernetInterfaces/${active_channel_config['${CHANNEL_NUMBER}']['name']}
294    ...  body=${data}  valid_status_codes=[${valid_status_code}]
295    Log To Console  ${resp.text}
296
297
298Verify Assigning Static IPv4 Address To VMI
299    [Documentation]    Verify assigning static IPv4 address to VMI.
300    [Arguments]  ${ip}  ${gateway}  ${netmask}  ${del_curr_ip}=${True}  ${host_reboot}=${True}
301    ...  ${valid_status_code}=${HTTP_ACCEPTED}
302
303    # Description of argument(s):
304    # ip                 VMI IPv4 address.
305    # gateway            Gateway for VMI IP.
306    # netmask            Subnetmask for VMI IP.
307    # del_curr_ip        Delete current VMI static IP if True.
308    # host_reboot        True when HOST reboot is required.
309    # valid_status_code  Expected valid status code from GET request. Default is HTTP_ACCEPTED.
310
311    # Delete current static IP based on user input.
312    ${curr_origin}=  Get Immediate Child Parameter From VMI Network Interface  DHCPEnabled
313    Run Keyword If  ${curr_origin} == ${False} and ${del_curr_ip} == ${True}  Delete VMI IPv4 Address
314
315    Set Static IPv4 Address To VMI  ${ip}  ${gateway}  ${netmask}  valid_status_code=${valid_status_code}
316    Return From Keyword If  ${valid_status_code} != ${HTTP_ACCEPTED}
317
318    Verify VMI Network Interface Details  ${ip}  Static  ${gateway}  ${netmask}  host_reboot=${host_reboot}
319
320
321Delete VMI IPv4 Address
322    [Documentation]  Delete VMI IPv4 address.
323    [Arguments]  ${delete_param}=IPv4StaticAddresses  ${valid_status_code}=${HTTP_ACCEPTED}
324
325    # Description of argument(s):
326    # delete_param       Parameter to be deleted eg. IPv4StaticAddresses or IPv4Addresses.
327    #                    Default is IPv4StaticAddresses.
328    # valid_status_code  Expected valid status code from PATCH request. Default is HTTP_OK.
329
330    ${data}=  Set Variable  {"${delete_param}": [${Null}]}
331    ${active_channel_config}=  Get Active Channel Config
332    ${resp}=  Redfish.Patch
333    ...  /redfish/v1/Systems/hypervisor/EthernetInterfaces/${active_channel_config['${CHANNEL_NUMBER}']['name']}
334    ...  body=${data}  valid_status_codes=[${valid_status_code}]
335
336
337Set VMI IPv4 Origin
338    [Documentation]  Set VMI IPv4 origin.
339    [Arguments]  ${dhcp_enabled}=${False}  ${valid_status_code}=${HTTP_ACCEPTED}
340
341    # Description of argument(s):
342    # dhcp_enabled       True if user wants to enable DHCP. Default is Static, hence value is set to False.
343    # valid_status_code  Expected valid status code from PATCH request. Default is HTTP_OK.
344
345    ${data}=  Set Variable If  ${dhcp_enabled} == ${False}  ${DISABLE_DHCP}  ${ENABLE_DHCP}
346    ${resp}=  Redfish.Patch  /redfish/v1/Systems/hypervisor/EthernetInterfaces/eth0  body=${data}
347    ...  valid_status_codes=[${valid_status_code}]
348
349
350Switch VMI IPv4 Origin And Verify Details
351    [Documentation]  Switch VMI IPv4 origin and verify details.
352    [Arguments]  ${host_reboot}=${False}
353
354    # Description of argument(s):
355    # host_reboot        Reboot HOST if True.
356
357    ${curr_mode}=  Get Immediate Child Parameter From VMI Network Interface  DHCPEnabled
358    ${dhcp_enabled}=  Set Variable If  ${curr_mode} == ${False}  ${True}  ${False}
359
360    ${default}=  Set Variable  0.0.0.0
361    ${origin}=  Set Variable If  ${curr_mode} == ${False}  DHCP  Static
362    Set VMI IPv4 Origin  ${dhcp_enabled}  ${HTTP_ACCEPTED}
363    Verify VMI Network Interface Details  ${default}  ${origin}  ${default}  ${default}  ${host_reboot}
364
365    [Return]  ${origin}
366