1*** Settings ***
2Documentation  Network interface configuration and verification
3               ...  tests.
4
5Resource       ../../lib/bmc_redfish_resource.robot
6Resource       ../../lib/bmc_network_utils.robot
7Resource       ../../lib/openbmc_ffdc.robot
8Library        ../../lib/bmc_network_utils.py
9Library        Collections
10
11Test Setup     Test Setup Execution
12Test Teardown  Test Teardown Execution
13
14Force Tags     Network_Conf_Test
15
16*** Variables ***
17${test_hostname}           openbmc
18${test_ipv4_addr}          10.7.7.7
19${test_ipv4_invalid_addr}  0.0.1.a
20${test_subnet_mask}        255.255.0.0
21${test_gateway}            10.7.7.1
22${broadcast_ip}            10.7.7.255
23${loopback_ip}             127.0.0.2
24${multicast_ip}            224.6.6.6
25${out_of_range_ip}         10.7.7.256
26
27# Valid netmask is 4 bytes long and has continuos block of 1s.
28# Maximum valid value in each octet is 255 and least value is 0.
29# 253 is not valid, as binary value is 11111101.
30${invalid_netmask}         255.255.253.0
31${alpha_netmask}           ff.ff.ff.ff
32# Maximum value of octet in netmask is 255.
33${out_of_range_netmask}    255.256.255.0
34${more_byte_netmask}       255.255.255.0.0
35${less_byte_netmask}       255.255.255
36${threshold_netmask}       255.255.255.255
37${lowest_netmask}          128.0.0.0
38
39# There will be 4 octets in IP address (e.g. xx.xx.xx.xx)
40# but trying to configure xx.xx.xx
41${less_octet_ip}           10.3.36
42
43# For the address 10.6.6.6, the 10.6.6.0 portion describes the
44# network ID and the 6 describe the host.
45
46${network_id}              10.7.7.0
47${hex_ip}                  0xa.0xb.0xc.0xd
48${negative_ip}             10.-7.-7.7
49${hex_ip}                  0xa.0xb.0xc.0xd
50@{static_name_servers}     10.5.5.5
51@{null_value}              null
52*** Test Cases ***
53
54Get IP Address And Verify
55    [Documentation]  Get IP Address And Verify.
56    [Tags]  Get_IP_Address_And_Verify
57
58    : FOR  ${network_configuration}  IN  @{network_configurations}
59    \  Verify IP On BMC  ${network_configuration['Address']}
60
61Get Netmask And Verify
62    [Documentation]  Get Netmask And Verify.
63    [Tags]  Get_Netmask_And_Verify
64
65    : FOR  ${network_configuration}  IN  @{network_configurations}
66    \  Verify Netmask On BMC  ${network_configuration['SubnetMask']}
67
68Get Gateway And Verify
69    [Documentation]  Get gateway and verify it's existence on the BMC.
70    [Tags]  Get_Gateway_And_Verify
71
72    : FOR  ${network_configuration}  IN  @{network_configurations}
73    \  Verify Gateway On BMC  ${network_configuration['Gateway']}
74
75Get MAC Address And Verify
76    [Documentation]  Get MAC address and verify it's existence on the BMC.
77    [Tags]  Get_MAC_Address_And_Verify
78
79    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH0_URI}
80    ${macaddr}=  Get From Dictionary  ${resp.dict}  MACAddress
81    Validate MAC On BMC  ${macaddr}
82
83Verify All Configured IP And Netmask
84    [Documentation]  Verify all configured IP and netmask on BMC.
85    [Tags]  Verify_All_Configured_IP_And_Netmask
86
87    : FOR  ${network_configuration}  IN  @{network_configurations}
88    \  Verify IP And Netmask On BMC  ${network_configuration['Address']}
89    ...  ${network_configuration['SubnetMask']}
90
91Get Hostname And Verify
92    [Documentation]  Get hostname via Redfish and verify.
93    [Tags]  Get_Hostname_And_Verify
94
95    ${hostname}=  Redfish_Utils.Get Attribute  ${REDFISH_NW_PROTOCOL_URI}  HostName
96
97    Validate Hostname On BMC  ${hostname}
98
99Configure Hostname And Verify
100    [Documentation]  Configure hostname via Redfish and verify.
101    [Tags]  Configure_Hostname_And_Verify
102
103    ${hostname}=  Redfish_Utils.Get Attribute  ${REDFISH_NW_PROTOCOL_URI}  HostName
104
105    Configure Hostname  ${test_hostname}
106    Validate Hostname On BMC  ${test_hostname}
107
108    # Revert back to initial hostname.
109    Configure Hostname  ${hostname}
110    Validate Hostname On BMC  ${hostname}
111
112Add Valid IPv4 Address And Verify
113    [Documentation]  Add IPv4 Address via Redfish and verify.
114    [Tags]  Add_Valid_IPv4_Addres_And_Verify
115
116     Add IP Address  ${test_ipv4_addr}  ${test_subnet_mask}  ${test_gateway}
117     Delete IP Address  ${test_ipv4_addr}
118
119Add Invalid IPv4 Address And Verify
120    [Documentation]  Add Invalid IPv4 Address via Redfish and verify.
121    [Tags]  Add_Invalid_IPv4_Addres_And_Verify
122
123    Add IP Address  ${test_ipv4_invalid_addr}  ${test_subnet_mask}
124    ...  ${test_gateway}  valid_status_codes=${HTTP_BAD_REQUEST}
125
126Configure Out Of Range IP
127    [Documentation]  Configure out-of-range IP address.
128    [Tags]  Configure_Out_Of_Range_IP
129    [Template]  Add IP Address
130
131    # ip                subnet_mask          gateway          valid_status_codes
132    ${out_of_range_ip}  ${test_subnet_mask}  ${test_gateway}  ${HTTP_BAD_REQUEST}
133
134Configure Broadcast IP
135    [Documentation]  Configure broadcast IP address.
136    [Tags]  Configure_Broadcast_IP
137    [Template]  Add IP Address
138    [Teardown]  Clear IP Settings On Fail  ${broadcast_ip}
139
140    # ip             subnet_mask          gateway          valid_status_codes
141    ${broadcast_ip}  ${test_subnet_mask}  ${test_gateway}  ${HTTP_BAD_REQUEST}
142
143Configure Multicast IP
144    [Documentation]  Configure multicast IP address.
145    [Tags]  Configure_Multicast_IP
146    [Template]  Add IP Address
147    [Teardown]  Clear IP Settings On Fail  ${multicast_ip}
148
149    # ip             subnet_mask          gateway          valid_status_codes
150    ${multicast_ip}  ${test_subnet_mask}  ${test_gateway}  ${HTTP_BAD_REQUEST}
151
152Configure Loopback IP
153    [Documentation]  Configure loopback IP address.
154    [Tags]  Configure_Loopback_IP
155    [Template]  Add IP Address
156    [Teardown]  Clear IP Settings On Fail  ${loopback_ip}
157
158    # ip            subnet_mask          gateway          valid_status_codes
159    ${loopback_ip}  ${test_subnet_mask}  ${test_gateway}  ${HTTP_BAD_REQUEST}
160
161Add Valid IPv4 Address And Check Persistency
162    [Documentation]  Add IPv4 address and check peristency.
163    [Tags]  Add_Valid_IPv4_Addres_And_Check_Persistency
164
165    Add IP Address  ${test_ipv4_addr}  ${test_subnet_mask}  ${test_gateway}
166
167    # Reboot BMC and verify persistency.
168    OBMC Reboot (off)
169    Verify IP On BMC  ${test_ipv4_addr}
170    Delete IP Address  ${test_ipv4_addr}
171
172Add Fourth Octet Threshold IP And Verify
173    [Documentation]  Add fourth octet threshold IP and verify.
174    [Tags]  Add_Fourth_Octet_Threshold_IP_And_Verify
175
176     Add IP Address  10.7.7.254  ${test_subnet_mask}  ${test_gateway}
177     Delete IP Address  10.7.7.254
178
179Add Fourth Octet Lowest IP And Verify
180    [Documentation]  Add fourth octet lowest IP and verify.
181    [Tags]  Add_Fourth_Octet_Lowest_IP_And_Verify
182
183     Add IP Address  10.7.7.1  ${test_subnet_mask}  ${test_gateway}
184     Delete IP Address  10.7.7.1
185
186Add Third Octet Threshold IP And Verify
187    [Documentation]  Add third octet threshold IP and verify.
188    [Tags]  Add_Third_Octet_Threshold_IP_And_Verify
189
190     Add IP Address  10.7.255.7  ${test_subnet_mask}  ${test_gateway}
191     Delete IP Address  10.7.255.7
192
193Add Third Octet Lowest IP And Verify
194    [Documentation]  Add third octet lowest IP and verify.
195    [Tags]  Add_Third_Octet_Lowest_IP_And_Verify
196
197     Add IP Address  10.7.0.7  ${test_subnet_mask}  ${test_gateway}
198     Delete IP Address  10.7.0.7
199
200Add Second Octet Threshold IP And Verify
201    [Documentation]  Add second octet threshold IP and verify.
202    [Tags]  Add_Second_Octet_Threshold_IP_And_Verify
203
204     Add IP Address  10.255.7.7  ${test_subnet_mask}  ${test_gateway}
205     Delete IP Address  10.255.7.7
206
207Add Second Octet Lowest IP And Verify
208    [Documentation]  Add second octet lowest IP and verify.
209    [Tags]  Add_Second_Octet_Lowest_IP_And_Verify
210
211     Add IP Address  10.0.7.7  ${test_subnet_mask}  ${test_gateway}
212     Delete IP Address  10.0.7.7
213
214Add First Octet Threshold IP And Verify
215    [Documentation]  Add first octet threshold IP and verify.
216    [Tags]  Add_First_Octet_Threshold_IP_And_Verify
217
218     Add IP Address  223.7.7.7  ${test_subnet_mask}  ${test_gateway}
219     Delete IP Address  223.7.7.7
220
221Add First Octet Lowest IP And Verify
222    [Documentation]  Add first octet lowest IP and verify.
223    [Tags]  Add_First_Octet_Lowest_IP_And_Verify
224
225     Add IP Address  1.7.7.7  ${test_subnet_mask}  ${test_gateway}
226     Delete IP Address  1.7.7.7
227
228Configure Invalid Netmask
229    [Documentation]  Verify error while setting invalid netmask.
230    [Tags]  Configure_Invalid_Netmask
231    [Template]  Add IP Address
232
233    # ip               subnet_mask         gateway          valid_status_codes
234    ${test_ipv4_addr}  ${invalid_netmask}  ${test_gateway}  ${HTTP_BAD_REQUEST}
235
236Configure Out Of Range Netmask
237    [Documentation]  Verify error while setting out of range netmask.
238    [Tags]  Configure_Out_Of_Range_Netmask
239    [Template]  Add IP Address
240
241    # ip               subnet_mask              gateway          valid_status_codes
242    ${test_ipv4_addr}  ${out_of_range_netmask}  ${test_gateway}  ${HTTP_BAD_REQUEST}
243
244Configure Alpha Netmask
245    [Documentation]  Verify error while setting alpha netmask.
246    [Tags]  Configure_Alpha_Netmask
247    [Template]  Add IP Address
248
249    # ip               subnet_mask       gateway          valid_status_codes
250    ${test_ipv4_addr}  ${alpha_netmask}  ${test_gateway}  ${HTTP_BAD_REQUEST}
251
252Configure More Byte Netmask
253    [Documentation]  Verify error while setting more byte netmask.
254    [Tags]  Configure_More_Byte_Netmask
255    [Template]  Add IP Address
256
257    # ip               subnet_mask           gateway          valid_status_codes
258    ${test_ipv4_addr}  ${more_byte_netmask}  ${test_gateway}  ${HTTP_BAD_REQUEST}
259
260Configure Less Byte Netmask
261    [Documentation]  Verify error while setting less byte netmask.
262    [Tags]  Configure_Less_Byte_Netmask
263    [Template]  Add IP Address
264
265    # ip               subnet_mask           gateway          valid_status_codes
266    ${test_ipv4_addr}  ${less_byte_netmask}  ${test_gateway}  ${HTTP_BAD_REQUEST}
267
268Configure Threshold Netmask And Verify
269    [Documentation]  Configure threshold netmask and verify.
270    [Tags]  Configure_Threshold_Netmask_And_verify
271
272     Add IP Address  ${test_ipv4_addr}  ${threshold_netmask}  ${test_gateway}
273     Delete IP Address  ${test_ipv4_addr}
274
275Configure Lowest Netmask And Verify
276    [Documentation]  Configure lowest netmask and verify.
277    [Tags]  Configure_Lowest_Netmask_And_verify
278
279     Add IP Address  ${test_ipv4_addr}  ${lowest_netmask}  ${test_gateway}
280     Delete IP Address  ${test_ipv4_addr}
281
282Configure Network ID
283    [Documentation]  Verify error while configuring network ID.
284    [Tags]  Configure_Network_ID
285    [Template]  Add IP Address
286    [Teardown]  Clear IP Settings On Fail  ${network_id}
287
288    # ip           subnet_mask          gateway          valid_status_codes
289    ${network_id}  ${test_subnet_mask}  ${test_gateway}  ${HTTP_BAD_REQUEST}
290
291Configure Less Octet IP
292    [Documentation]  Verify error while Configuring less octet IP address.
293    [Tags]  Configure_Less_Octet_IP
294    [Template]  Add IP Address
295
296    # ip              subnet_mask          gateway          valid_status_codes
297    ${less_octet_ip}  ${test_subnet_mask}  ${test_gateway}  ${HTTP_BAD_REQUEST}
298
299Configure Empty IP
300    [Documentation]  Verify error while Configuring empty IP address.
301    [Tags]  Configure_Empty_IP
302    [Template]  Add IP Address
303
304    # ip      subnet_mask          gateway          valid_status_codes
305    ${EMPTY}  ${test_subnet_mask}  ${test_gateway}  ${HTTP_BAD_REQUEST}
306
307Configure Special Char IP
308    [Documentation]  Configure invalid IP address containing special chars.
309    [Tags]  Configure_Special_Char_IP
310    [Template]  Add IP Address
311
312    # ip          subnet_mask          gateway          valid_status_codes
313    @@@.%%.44.11  ${test_subnet_mask}  ${test_gateway}  ${HTTP_BAD_REQUEST}
314
315Configure Hexadecimal IP
316    [Documentation]  Configure invalid IP address containing hex value.
317    [Tags]  Configure_Hexadecimal_IP
318    [Template]  Add IP Address
319
320    # ip       subnet_mask          gateway          valid_status_codes
321    ${hex_ip}  ${test_subnet_mask}  ${test_gateway}  ${HTTP_BAD_REQUEST}
322
323Configure Negative Octet IP
324    [Documentation]  Configure invalid IP address containing negative octet.
325    [Tags]  Configure_Negative_Octet_IP
326    [Template]  Add IP Address
327
328    # ip            subnet_mask          gateway          valid_status_codes
329    ${negative_ip}  ${test_subnet_mask}  ${test_gateway}  ${HTTP_BAD_REQUEST}
330
331Configure Incomplete IP For Gateway
332    [Documentation]  Configure incomplete IP for gateway and expect an error.
333    [Tags]  Configure_Incomplete_IP_For_Gateway
334    [Template]  Add IP Address
335
336    # ip               subnet_mask          gateway           valid_status_codes
337    ${test_ipv4_addr}  ${test_subnet_mask}  ${less_octet_ip}  ${HTTP_BAD_REQUEST}
338
339Configure Special Char IP For Gateway
340    [Documentation]  Configure special char IP for gateway and expect an error.
341    [Tags]  Configure_Special_Char_IP_For_Gateway
342    [Template]  Add IP Address
343
344    # ip               subnet_mask          gateway       valid_status_codes
345    ${test_ipv4_addr}  ${test_subnet_mask}  @@@.%%.44.11  ${HTTP_BAD_REQUEST}
346
347Configure Hexadecimal IP For Gateway
348    [Documentation]  Configure hexadecimal IP for gateway and expect an error.
349    [Tags]  Configure_Hexadecimal_IP_For_Gateway
350    [Template]  Add IP Address
351
352    # ip               subnet_mask          gateway    valid_status_codes
353    ${test_ipv4_addr}  ${test_subnet_mask}  ${hex_ip}  ${HTTP_BAD_REQUEST}
354
355Get DNS Server And Verify
356    [Documentation]  Get DNS server via Redfish and verify.
357    [Tags]  Get_DNS_Server_And_Verify
358
359    Verify CLI and Redfish Nameservers
360
361Configure DNS Server And Verify
362    [Documentation]  Configure DNS server and verify.
363    [Tags]  Configure_DNS_Server_And_Verify
364    [Setup]  DNS Test Setup Execution
365    [Teardown]  Run Keywords
366    ...  Configure Static Name Servers  AND  Test Teardown Execution
367
368    Configure Static Name Servers  ${static_name_servers}
369    Verify CLI and Redfish Nameservers
370
371Delete DNS Server And Verify
372    [Documentation]  Delete DNS server and verify.
373    [Tags]  Delete_DNS_Server_And_Verify
374    [Setup]  DNS Test Setup Execution
375    [Teardown]  Run Keywords
376    ...  Configure Static Name Servers  AND  Test Teardown Execution
377
378    Delete Static Name Servers
379    Verify CLI and Redfish Nameservers
380
381Configure DNS Server And Check Persistency
382    [Documentation]  Configure DNS server and check persistency on reboot.
383    [Tags]  Configure_DNS_Server_And_Check_Persistency
384    [Setup]  DNS Test Setup Execution
385    [Teardown]  Run Keywords
386    ...  Configure Static Name Servers  AND  Test Teardown Execution
387
388    Configure Static Name Servers  ${static_name_servers}
389    # Reboot BMC and verify persistency.
390    OBMC Reboot (off)
391    Verify CLI and Redfish Nameservers
392
393Configure Loopback IP For Gateway
394    [Documentation]  Configure loopback IP for gateway and expect an error.
395    [Tags]  Configure_Loopback_IP_For_Gateway
396    [Template]  Add IP Address
397    [Teardown]  Clear IP Settings On Fail  ${test_ipv4_addr}
398
399    # ip               subnet_mask          gateway         valid_status_codes
400    ${test_ipv4_addr}  ${test_subnet_mask}  ${loopback_ip}  ${HTTP_BAD_REQUEST}
401
402Configure Network ID For Gateway
403    [Documentation]  Configure network ID for gateway and expect an error.
404    [Tags]  Configure_Network_ID_For_Gateway
405    [Template]  Add IP Address
406    [Teardown]  Clear IP Settings On Fail  ${test_ipv4_addr}
407
408    # ip               subnet_mask          gateway        valid_status_codes
409    ${test_ipv4_addr}  ${test_subnet_mask}  ${network_id}  ${HTTP_BAD_REQUEST}
410
411Configure Multicast IP For Gateway
412    [Documentation]  Configure multicast IP for gateway and expect an error.
413    [Tags]  Configure_Multicast_IP_For_Gateway
414    [Template]  Add IP Address
415    [Teardown]  Clear IP Settings On Fail  ${test_ipv4_addr}
416
417    # ip               subnet_mask          gateway           valid_status_codes
418    ${test_ipv4_addr}  ${test_subnet_mask}  ${multicaste_ip}  ${HTTP_BAD_REQUEST}
419
420Configure Broadcast IP For Gateway
421    [Documentation]  Configure broadcast IP for gateway and expect an error.
422    [Tags]  Configure_Broadcast_IP_For_Gateway
423    [Template]  Add IP Address
424    [Teardown]  Clear IP Settings On Fail  ${test_ipv4_addr}
425
426    # ip               subnet_mask          gateway          valid_status_codes
427    ${test_ipv4_addr}  ${test_subnet_mask}  ${broadcast_ip}  ${HTTP_BAD_REQUEST}
428
429Configure Null Value For DNS Server
430    [Documentation]  Configure null value for DNS server and expect an error.
431    [Tags]  Configure_Null_Value_For_DNS_Server
432    [Setup]  DNS Test Setup Execution
433    [Teardown]  Run Keywords
434    ...  Configure Static Name Servers  AND  Test Teardown Execution
435
436    Configure Static Name Servers  ${null_value}  ${HTTP_BAD_REQUEST}
437
438*** Keywords ***
439
440Test Setup Execution
441    [Documentation]  Test setup execution.
442
443    Redfish.Login
444
445    @{network_configurations}=  Get Network Configuration
446    Set Test Variable  @{network_configurations}
447
448    # Get BMC IP address and prefix length.
449    ${ip_data}=  Get BMC IP Info
450    Set Test Variable  ${ip_data}
451
452
453Get Network Configuration
454    [Documentation]  Get network configuration.
455
456    # Sample output:
457    #{
458    #  "@odata.context": "/redfish/v1/$metadata#EthernetInterface.EthernetInterface",
459    #  "@odata.id": "/redfish/v1/Managers/bmc/EthernetInterfaces/eth0",
460    #  "@odata.type": "#EthernetInterface.v1_2_0.EthernetInterface",
461    #  "Description": "Management Network Interface",
462    #  "IPv4Addresses": [
463    #    {
464    #      "Address": "169.254.xx.xx",
465    #      "AddressOrigin": "IPv4LinkLocal",
466    #      "Gateway": "0.0.0.0",
467    #      "SubnetMask": "255.255.0.0"
468    #    },
469    #    {
470    #      "Address": "xx.xx.xx.xx",
471    #      "AddressOrigin": "Static",
472    #      "Gateway": "xx.xx.xx.1",
473    #      "SubnetMask": "xx.xx.xx.xx"
474    #    }
475    #  ],
476    #  "Id": "eth0",
477    #  "MACAddress": "xx:xx:xx:xx:xx:xx",
478    #  "Name": "Manager Ethernet Interface",
479    #  "SpeedMbps": 0,
480    #  "VLAN": {
481    #    "VLANEnable": false,
482    #    "VLANId": 0
483    #  }
484
485    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH0_URI}
486    @{network_configurations}=  Get From Dictionary  ${resp.dict}  IPv4StaticAddresses
487    [Return]  @{network_configurations}
488
489
490Verify IP On BMC
491    [Documentation]  Verify IP on BMC.
492    [Arguments]  ${ip}
493
494    # Description of argument(s):
495    # ip  IP address to be verified (e.g. "10.7.7.7").
496
497    # Get IP address details on BMC using IP command.
498    @{ip_data}=  Get BMC IP Info
499    Should Contain Match  ${ip_data}  ${ip}/*
500    ...  msg=IP address does not exist.
501
502Add IP Address
503    [Documentation]  Add IP Address To BMC.
504    [Arguments]  ${ip}  ${subnet_mask}  ${gateway}
505    ...  ${valid_status_codes}=${HTTP_OK}
506
507    # Description of argument(s):
508    # ip                  IP address to be added (e.g. "10.7.7.7").
509    # subnet_mask         Subnet mask for the IP to be added
510    #                     (e.g. "255.255.0.0").
511    # gateway             Gateway for the IP to be added (e.g. "10.7.7.1").
512    # valid_status_codes  Expected return code from patch operation
513    #                     (e.g. "200").  See prolog of rest_request
514    #                     method in redfish_plut.py for details.
515
516    ${empty_dict}=  Create Dictionary
517    ${ip_data}=  Create Dictionary  Address=${ip}
518    ...  SubnetMask=${subnet_mask}  Gateway=${gateway}
519
520    ${patch_list}=  Create List
521    ${network_configurations}=  Get Network Configuration
522    ${num_entries}=  Get Length  ${network_configurations}
523
524    : FOR  ${INDEX}  IN RANGE  0  ${num_entries}
525    \  Append To List  ${patch_list}  ${empty_dict}
526
527    # We need not check for existence of IP on BMC while adding.
528    Append To List  ${patch_list}  ${ip_data}
529    ${data}=  Create Dictionary  IPv4StaticAddresses=${patch_list}
530
531    Redfish.patch  ${REDFISH_NW_ETH0_URI}  body=&{data}
532    ...  valid_status_codes=[${valid_status_codes}]
533
534    Return From Keyword If  '${valid_status_codes}' != '${HTTP_OK}'
535
536    # Note: Network restart takes around 15-18s after patch request processing.
537    Sleep  ${NETWORK_TIMEOUT}s
538    Wait For Host To Ping  ${OPENBMC_HOST}  ${NETWORK_TIMEOUT}
539
540    Verify IP On BMC  ${ip}
541    Validate Network Config On BMC
542
543
544Delete IP Address
545    [Documentation]  Delete IP Address Of BMC.
546    [Arguments]  ${ip}  ${valid_status_codes}=${HTTP_OK}
547
548    # Description of argument(s):
549    # ip                  IP address to be deleted (e.g. "10.7.7.7").
550    # valid_status_codes  Expected return code from patch operation
551    #                     (e.g. "200").  See prolog of rest_request
552    #                     method in redfish_plut.py for details.
553
554    ${empty_dict}=  Create Dictionary
555    ${patch_list}=  Create List
556
557    @{network_configurations}=  Get Network Configuration
558    : FOR  ${network_configuration}  IN  @{network_configurations}
559    \  Run Keyword If  '${network_configuration['Address']}' == '${ip}'
560       ...  Append To List  ${patch_list}  ${null}
561       ...  ELSE  Append To List  ${patch_list}  ${empty_dict}
562
563    ${ip_found}=  Run Keyword And Return Status  List Should Contain Value
564    ...  ${patch_list}  ${null}  msg=${ip} does not exist on BMC
565    Pass Execution If  ${ip_found} == ${False}  ${ip} does not exist on BMC
566
567    # Run patch command only if given IP is found on BMC
568    ${data}=  Create Dictionary  IPv4StaticAddresses=${patch_list}
569
570    Redfish.patch  ${REDFISH_NW_ETH0_URI}  body=&{data}
571    ...  valid_status_codes=[${valid_status_codes}]
572
573    # Note: Network restart takes around 15-18s after patch request processing
574    Sleep  ${NETWORK_TIMEOUT}s
575    Wait For Host To Ping  ${OPENBMC_HOST}  ${NETWORK_TIMEOUT}
576
577    ${delete_status}=  Run Keyword And Return Status  Verify IP On BMC  ${ip}
578    Run Keyword If  '${valid_status_codes}' == '${HTTP_OK}'
579    ...  Should Be True  ${delete_status} == ${False}
580    ...  ELSE  Should Be True  ${delete_status} == ${True}
581
582    Validate Network Config On BMC
583
584
585Validate Network Config On BMC
586    [Documentation]  Check that network info obtained via redfish matches info
587    ...              obtained via CLI.
588
589    @{network_configurations}=  Get Network Configuration
590    ${ip_data}=  Get BMC IP Info
591    : FOR  ${network_configuration}  IN  @{network_configurations}
592    \  Should Contain Match  ${ip_data}  ${network_configuration['Address']}/*
593    ...  msg=IP address does not exist.
594
595
596Verify Netmask On BMC
597    [Documentation]  Verify netmask on BMC.
598    [Arguments]  ${netmask}
599
600    # Description of the argument(s):
601    # netmask  netmask value to be verified.
602
603    ${prefix_length}=  Netmask Prefix Length  ${netmask}
604
605    Should Contain Match  ${ip_data}  */${prefix_length}
606    ...  msg=Prefix length does not exist.
607
608Verify Gateway On BMC
609    [Documentation]  Verify gateway on BMC.
610    [Arguments]  ${gateway_ip}=0.0.0.0
611
612    # Description of argument(s):
613    # gateway_ip  Gateway IP address.
614
615    ${route_info}=  Get BMC Route Info
616
617    # If gateway IP is empty or 0.0.0.0 it will not have route entry.
618
619    Run Keyword If  '${gateway_ip}' == '0.0.0.0'
620    ...      Pass Execution  Gateway IP is "0.0.0.0".
621    ...  ELSE
622    ...      Should Contain  ${route_info}  ${gateway_ip}
623    ...      msg=Gateway IP address not matching.
624
625Verify IP And Netmask On BMC
626    [Documentation]  Verify IP and netmask on BMC.
627    [Arguments]  ${ip}  ${netmask}
628
629    # Description of the argument(s):
630    # ip       IP address to be verified.
631    # netmask  netmask value to be verified.
632
633    ${prefix_length}=  Netmask Prefix Length  ${netmask}
634    @{ip_data}=  Get BMC IP Info
635
636    ${ip_with_netmask}=  Catenate  ${ip}/${prefix_length}
637    Should Contain  ${ip_data}  ${ip_with_netmask}
638    ...  msg=IP and netmask pair does not exist.
639
640Validate Hostname On BMC
641    [Documentation]  Verify that the hostname read via Redfish is the same as the
642    ...  hostname configured on system.
643    [Arguments]  ${hostname}
644
645    # Description of argument(s):
646    # hostname  A hostname value which is to be compared to the hostname
647    #           configured on system.
648
649    ${sys_hostname}=  Get BMC Hostname
650    Should Be Equal  ${sys_hostname}  ${hostname}
651    ...  ignore_case=True  msg=Hostname does not exist.
652
653Test Teardown Execution
654    [Documentation]  Test teardown execution.
655
656    FFDC On Test Case Fail
657    Redfish.Logout
658
659Clear IP Settings On Fail
660    [Documentation]  Clear IP settings on fail.
661    [Arguments]  ${ip}
662
663    # Description of argument(s):
664    # ip  IP address to be deleted.
665
666    Run Keyword If  '${TEST STATUS}' == 'FAIL'
667    ...  Delete IP Address  ${ip}
668
669    Test Teardown Execution
670
671Verify CLI and Redfish Nameservers
672    [Documentation]  Verify that nameservers obtained via Redfish do not
673    ...  match those found in /etc/resolv.conf.
674
675    ${redfish_nameservers}=  Redfish.Get Attribute  ${REDFISH_NW_ETH0_URI}  StaticNameServers
676    ${resolve_conf_nameservers}=  CLI Get Nameservers
677    Rqprint Vars  redfish_nameservers  resolve_conf_nameservers
678
679    # Check that the 2 lists are equivalent.
680    ${match}=  Evaluate  set($redfish_nameservers) == set($resolve_conf_nameservers)
681    Should Be True  ${match}
682    ...  The nameservers obtained via Redfish do not match those found in /etc/resolv.conf.
683
684CLI Get Nameservers
685    [Documentation]  Get the nameserver IPs from /etc/resolv.conf and return as a list.
686
687    # Example of /etc/resolv.conf data:
688    # nameserver x.x.x.x
689    # nameserver y.y.y.y
690
691    ${stdout}  ${stderr}  ${rc}=  BMC Execute Command  egrep nameserver /etc/resolv.conf | cut -f2- -d ' '
692    ${nameservers}=  Split String  ${stdout}
693
694    [Return]  ${nameservers}
695
696
697Configure Static Name Servers
698    [Documentation]  Configure DNS server on BMC.
699    [Arguments]  ${static_name_servers}=${original_nameservers}
700     ...  ${valid_status_codes}=${HTTP_OK}
701
702    # Description of the argument(s):
703    # static_name_servers  A list of static name server IPs to be
704    #                      configured on the BMC.
705
706    Redfish.Patch  ${REDFISH_NW_ETH0_URI}  body={'StaticNameServers': ${static_name_servers}}
707    ...  valid_status_codes=[${valid_status_codes}]
708
709    # Check if newly added DNS server is configured on BMC.
710    ${cli_nameservers}=  CLI Get Nameservers
711    ${cmd_status}=  Run Keyword And Return Status
712    ...  List Should Contain Sub List  ${cli_nameservers}  ${static_name_servers}
713
714    Run Keyword If  '${valid_status_codes}' == '${HTTP_OK}'
715    ...  Should Be True  ${cmd_status} == ${True}
716    ...  ELSE  Should Be True  ${cmd_status} == ${False}
717
718Delete Static Name Servers
719    [Documentation]  Delete static name servers.
720
721    Configure Static Name Servers  @{EMPTY}
722
723    # Check if all name servers deleted on BMC.
724    ${nameservers}=  CLI Get Nameservers
725    Should Be Empty  ${nameservers}
726
727DNS Test Setup Execution
728    [Documentation]  Do DNS test setup execution.
729
730    Redfish.Login
731
732    ${original_nameservers}=  Redfish.Get Attribute  ${REDFISH_NW_ETH0_URI}  StaticNameServers
733    Rprint Vars  original_nameservers
734    # Set suite variables to trigger restoration during teardown.
735    Set Suite Variable  ${original_nameservers}
736