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
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
393
394*** Keywords ***
395
396Test Setup Execution
397    [Documentation]  Test setup execution.
398
399    Redfish.Login
400
401    @{network_configurations}=  Get Network Configuration
402    Set Test Variable  @{network_configurations}
403
404    # Get BMC IP address and prefix length.
405    ${ip_data}=  Get BMC IP Info
406    Set Test Variable  ${ip_data}
407
408
409Get Network Configuration
410    [Documentation]  Get network configuration.
411
412    # Sample output:
413    #{
414    #  "@odata.context": "/redfish/v1/$metadata#EthernetInterface.EthernetInterface",
415    #  "@odata.id": "/redfish/v1/Managers/bmc/EthernetInterfaces/eth0",
416    #  "@odata.type": "#EthernetInterface.v1_2_0.EthernetInterface",
417    #  "Description": "Management Network Interface",
418    #  "IPv4Addresses": [
419    #    {
420    #      "Address": "169.254.xx.xx",
421    #      "AddressOrigin": "IPv4LinkLocal",
422    #      "Gateway": "0.0.0.0",
423    #      "SubnetMask": "255.255.0.0"
424    #    },
425    #    {
426    #      "Address": "xx.xx.xx.xx",
427    #      "AddressOrigin": "Static",
428    #      "Gateway": "xx.xx.xx.1",
429    #      "SubnetMask": "xx.xx.xx.xx"
430    #    }
431    #  ],
432    #  "Id": "eth0",
433    #  "MACAddress": "xx:xx:xx:xx:xx:xx",
434    #  "Name": "Manager Ethernet Interface",
435    #  "SpeedMbps": 0,
436    #  "VLAN": {
437    #    "VLANEnable": false,
438    #    "VLANId": 0
439    #  }
440
441    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH0_URI}
442    @{network_configurations}=  Get From Dictionary  ${resp.dict}  IPv4StaticAddresses
443    [Return]  @{network_configurations}
444
445
446Verify IP On BMC
447    [Documentation]  Verify IP on BMC.
448    [Arguments]  ${ip}
449
450    # Description of argument(s):
451    # ip  IP address to be verified (e.g. "10.7.7.7").
452
453    # Get IP address details on BMC using IP command.
454    @{ip_data}=  Get BMC IP Info
455    Should Contain Match  ${ip_data}  ${ip}/*
456    ...  msg=IP address does not exist.
457
458Add IP Address
459    [Documentation]  Add IP Address To BMC.
460    [Arguments]  ${ip}  ${subnet_mask}  ${gateway}
461    ...  ${valid_status_codes}=${HTTP_OK}
462
463    # Description of argument(s):
464    # ip                  IP address to be added (e.g. "10.7.7.7").
465    # subnet_mask         Subnet mask for the IP to be added
466    #                     (e.g. "255.255.0.0").
467    # gateway             Gateway for the IP to be added (e.g. "10.7.7.1").
468    # valid_status_codes  Expected return code from patch operation
469    #                     (e.g. "200").  See prolog of rest_request
470    #                     method in redfish_plut.py for details.
471
472    ${empty_dict}=  Create Dictionary
473    ${ip_data}=  Create Dictionary  Address=${ip}
474    ...  SubnetMask=${subnet_mask}  Gateway=${gateway}
475
476    ${patch_list}=  Create List
477    ${network_configurations}=  Get Network Configuration
478    ${num_entries}=  Get Length  ${network_configurations}
479
480    : FOR  ${INDEX}  IN RANGE  0  ${num_entries}
481    \  Append To List  ${patch_list}  ${empty_dict}
482
483    # We need not check for existence of IP on BMC while adding.
484    Append To List  ${patch_list}  ${ip_data}
485    ${data}=  Create Dictionary  IPv4StaticAddresses=${patch_list}
486
487    Redfish.patch  ${REDFISH_NW_ETH0_URI}  body=&{data}
488    ...  valid_status_codes=[${valid_status_codes}]
489
490    Return From Keyword If  '${valid_status_codes}' != '${HTTP_OK}'
491
492    # Note: Network restart takes around 15-18s after patch request processing.
493    Sleep  ${NETWORK_TIMEOUT}s
494    Wait For Host To Ping  ${OPENBMC_HOST}  ${NETWORK_TIMEOUT}
495
496    Verify IP On BMC  ${ip}
497    Validate Network Config On BMC
498
499
500Delete IP Address
501    [Documentation]  Delete IP Address Of BMC.
502    [Arguments]  ${ip}  ${valid_status_codes}=${HTTP_OK}
503
504    # Description of argument(s):
505    # ip                  IP address to be deleted (e.g. "10.7.7.7").
506    # valid_status_codes  Expected return code from patch operation
507    #                     (e.g. "200").  See prolog of rest_request
508    #                     method in redfish_plut.py for details.
509
510    ${empty_dict}=  Create Dictionary
511    ${patch_list}=  Create List
512
513    @{network_configurations}=  Get Network Configuration
514    : FOR  ${network_configuration}  IN  @{network_configurations}
515    \  Run Keyword If  '${network_configuration['Address']}' == '${ip}'
516       ...  Append To List  ${patch_list}  ${null}
517       ...  ELSE  Append To List  ${patch_list}  ${empty_dict}
518
519    ${ip_found}=  Run Keyword And Return Status  List Should Contain Value
520    ...  ${patch_list}  ${null}  msg=${ip} does not exist on BMC
521    Pass Execution If  ${ip_found} == ${False}  ${ip} does not exist on BMC
522
523    # Run patch command only if given IP is found on BMC
524    ${data}=  Create Dictionary  IPv4StaticAddresses=${patch_list}
525
526    Redfish.patch  ${REDFISH_NW_ETH0_URI}  body=&{data}
527    ...  valid_status_codes=[${valid_status_codes}]
528
529    # Note: Network restart takes around 15-18s after patch request processing
530    Sleep  ${NETWORK_TIMEOUT}s
531    Wait For Host To Ping  ${OPENBMC_HOST}  ${NETWORK_TIMEOUT}
532
533    ${delete_status}=  Run Keyword And Return Status  Verify IP On BMC  ${ip}
534    Run Keyword If  '${valid_status_codes}' == '${HTTP_OK}'
535    ...  Should Be True  ${delete_status} == ${False}
536    ...  ELSE  Should Be True  ${delete_status} == ${True}
537
538    Validate Network Config On BMC
539
540
541Validate Network Config On BMC
542    [Documentation]  Check that network info obtained via redfish matches info
543    ...              obtained via CLI.
544
545    @{network_configurations}=  Get Network Configuration
546    ${ip_data}=  Get BMC IP Info
547    : FOR  ${network_configuration}  IN  @{network_configurations}
548    \  Should Contain Match  ${ip_data}  ${network_configuration['Address']}/*
549    ...  msg=IP address does not exist.
550
551
552Verify Netmask On BMC
553    [Documentation]  Verify netmask on BMC.
554    [Arguments]  ${netmask}
555
556    # Description of the argument(s):
557    # netmask  netmask value to be verified.
558
559    ${prefix_length}=  Netmask Prefix Length  ${netmask}
560
561    Should Contain Match  ${ip_data}  */${prefix_length}
562    ...  msg=Prefix length does not exist.
563
564Verify Gateway On BMC
565    [Documentation]  Verify gateway on BMC.
566    [Arguments]  ${gateway_ip}=0.0.0.0
567
568    # Description of argument(s):
569    # gateway_ip  Gateway IP address.
570
571    ${route_info}=  Get BMC Route Info
572
573    # If gateway IP is empty or 0.0.0.0 it will not have route entry.
574
575    Run Keyword If  '${gateway_ip}' == '0.0.0.0'
576    ...      Pass Execution  Gateway IP is "0.0.0.0".
577    ...  ELSE
578    ...      Should Contain  ${route_info}  ${gateway_ip}
579    ...      msg=Gateway IP address not matching.
580
581Verify IP And Netmask On BMC
582    [Documentation]  Verify IP and netmask on BMC.
583    [Arguments]  ${ip}  ${netmask}
584
585    # Description of the argument(s):
586    # ip       IP address to be verified.
587    # netmask  netmask value to be verified.
588
589    ${prefix_length}=  Netmask Prefix Length  ${netmask}
590    @{ip_data}=  Get BMC IP Info
591
592    ${ip_with_netmask}=  Catenate  ${ip}/${prefix_length}
593    Should Contain  ${ip_data}  ${ip_with_netmask}
594    ...  msg=IP and netmask pair does not exist.
595
596Validate Hostname On BMC
597    [Documentation]  Verify that the hostname read via Redfish is the same as the
598    ...  hostname configured on system.
599    [Arguments]  ${hostname}
600
601    # Description of argument(s):
602    # hostname  A hostname value which is to be compared to the hostname
603    #           configured on system.
604
605    ${sys_hostname}=  Get BMC Hostname
606    Should Be Equal  ${sys_hostname}  ${hostname}
607    ...  ignore_case=True  msg=Hostname does not exist.
608
609Test Teardown Execution
610    [Documentation]  Test teardown execution.
611
612    FFDC On Test Case Fail
613    Redfish.Logout
614
615Clear IP Settings On Fail
616    [Documentation]  Clear IP settings on fail.
617    [Arguments]  ${ip}
618
619    # Description of argument(s):
620    # ip  IP address to be deleted.
621
622    Run Keyword If  '${TEST STATUS}' == 'FAIL'
623    ...  Delete IP Address  ${ip}
624
625    Test Teardown Execution
626
627Verify CLI and Redfish Nameservers
628    [Documentation]  Verify that nameservers obtained via Redfish do not
629    ...  match those found in /etc/resolv.conf.
630
631    ${redfish_nameservers}=  Redfish.Get Attribute  ${REDFISH_NW_ETH0_URI}  StaticNameServers
632    ${resolve_conf_nameservers}=  CLI Get Nameservers
633    Rqprint Vars  redfish_nameservers  resolve_conf_nameservers  fmt=terse
634
635    # Check that the 2 lists are equivalent.
636    ${match}=  Evaluate  set($redfish_nameservers) == set($resolve_conf_nameservers)
637    Should Be True  ${match}
638    ...  The nameservers obtained via Redfish do not match those found in /etc/resolv.conf.
639
640CLI Get Nameservers
641    [Documentation]  Get the nameserver IPs from /etc/resolv.conf and return as a list.
642
643    # Example of /etc/resolv.conf data:
644    # nameserver x.x.x.x
645    # nameserver y.y.y.y
646
647    ${stdout}  ${stderr}  ${rc}=  BMC Execute Command  egrep nameserver /etc/resolv.conf | cut -f2- -d ' '
648    ${nameservers}=  Split String  ${stdout}
649
650    [Return]  ${nameservers}
651
652
653Configure Static Name Servers
654    [Documentation]  Configure DNS server on BMC.
655    [Arguments]  ${static_name_servers}=${original_nameservers}
656
657    # Description of the argument(s):
658    # static_name_servers  A list of static name server IPs to be
659    #                      configured on the BMC.
660
661    Redfish.Patch  ${REDFISH_NW_ETH0_URI}  body={'StaticNameServers': ${static_name_servers}}
662
663Delete Static Name Servers
664    [Documentation]  Delete static name servers.
665
666    Configure Static Name Servers  @{EMPTY}
667
668    # Check if all name servers deleted on BMC.
669    ${nameservers}=  CLI Get Nameservers
670    Should Be Empty  ${nameservers}
671
672DNS Test Setup Execution
673    [Documentation]  Do DNS test setup execution.
674
675    Redfish.Login
676
677    ${original_nameservers}=  Redfish.Get Attribute  ${REDFISH_NW_ETH0_URI}  StaticNameServers
678    Rprint Vars  original_nameservers
679    # Set suite variables to trigger restoration during teardown.
680    Set Suite Variable  ${original_nameservers}
681