xref: /openbmc/openbmc-test-automation/redfish/managers/test_bmc_ipv6.robot (revision 9e190dd291b8cef2dbd5998201dc9a22929b951c)
1*** Settings ***
2Documentation  Network interface IPv6 configuration and verification
3               ...  tests.
4
5Resource       ../../lib/bmc_redfish_resource.robot
6Resource       ../../lib/openbmc_ffdc.robot
7Resource       ../../lib/bmc_ipv6_utils.robot
8Resource       ../../lib/external_intf/vmi_utils.robot
9Resource       ../../lib/bmc_network_utils.robot
10Library        ../../lib/bmc_network_utils.py
11Library        Collections
12Library        Process
13
14Test Setup      Test Setup Execution
15Test Teardown   Test Teardown Execution
16Suite Setup     Suite Setup Execution
17Suite Teardown  Redfish.Logout
18
19Test Tags     BMC_IPv6
20
21*** Variables ***
22${test_ipv6_addr}            2001:db8:3333:4444:5555:6666:7777:8888
23${test_ipv6_invalid_addr}    2001:db8:3333:4444:5555:6666:7777:JJKK
24${test_ipv6_addr1}           2001:db8:3333:4444:5555:6666:7777:9999
25${invalid_hexadec_ipv6}      x:x:x:x:x:x:10.5.5.6
26${ipv6_multi_short}          2001::33::111
27# Valid prefix length is a integer ranges from 1 to 128.
28${test_prefix_length}        64
29${ipv6_gw_addr}              2002:903:15F:32:9:3:32:1
30${prefix_length_def}         None
31${invalid_staticv6_gateway}  9.41.164.1
32${new_mac_addr}              AA:E2:84:14:28:79
33${linklocal_addr_format}     fe80::[0-9a-f:]+$
34${link_local_addr}           fe80::
35${link_local_prefix_len}     10
36
37*** Test Cases ***
38
39Get IPv6 Address And Verify
40    [Documentation]  Get IPv6 Address And Verify.
41    [Tags]  Get_IPv6_Address_And_Verify
42
43    FOR  ${ipv6_network_configuration}  IN  @{ipv6_network_configurations}
44      Verify IPv6 On BMC  ${ipv6_network_configuration['Address']}
45    END
46
47
48Get PrefixLength And Verify
49    [Documentation]  Get IPv6 prefix length and verify.
50    [Tags]  Get_PrefixLength_And_Verify
51
52    FOR  ${ipv6_network_configuration}  IN  @{ipv6_network_configurations}
53      Verify IPv6 On BMC  ${ipv6_network_configuration['PrefixLength']}
54    END
55
56
57Get IPv6 Default Gateway And Verify
58    [Documentation]  Get IPv6 default gateway and verify.
59    [Tags]  Get_IPv6_Default_Gateway_And_Verify
60
61    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}
62    ${ipv6_gateway}=  Get From Dictionary  ${resp.dict}  IPv6DefaultGateway
63    Verify IPv6 Default Gateway On BMC  ${ipv6_gateway}
64
65
66Verify All Configured IPv6 And PrefixLength On BMC
67    [Documentation]  Verify IPv6 address and its prefix length on BMC.
68    [Tags]  Verify_All_Configured_IPv6_And_PrefixLength_On_BMC
69
70    FOR  ${ipv6_network_configuration}  IN  @{ipv6_network_configurations}
71      Verify IPv6 And PrefixLength  ${ipv6_network_configuration['Address']}
72      ...  ${ipv6_network_configuration['PrefixLength']}
73    END
74
75
76Configure IPv6 Address And Verify
77    [Documentation]  Configure IPv6 address and verify.
78    [Tags]  Configure_IPv6_Address_And_Verify
79    [Teardown]  Run Keywords
80    ...  Delete IPv6 Address  ${test_ipv6_addr}  AND  Test Teardown Execution
81    [Template]  Configure IPv6 Address On BMC
82
83
84    # IPv6 address     Prefix length
85    ${test_ipv6_addr}  ${test_prefix_length}
86
87
88Delete IPv6 Address And Verify
89    [Documentation]  Delete IPv6 address and verify.
90    [Tags]  Delete_IPv6_Address_And_Verify
91
92    Configure IPv6 Address On BMC  ${test_ipv6_addr}  ${test_prefix_length}
93
94    Delete IPv6 Address  ${test_ipv6_addr}
95
96
97Modify IPv6 Address And Verify
98    [Documentation]  Modify IPv6 address and verify.
99    [Tags]  Modify_IPv6_Address_And_Verify
100    [Teardown]  Run Keywords
101    ...  Delete IPv6 Address  ${test_ipv6_addr1}  AND  Test Teardown Execution
102
103    Configure IPv6 Address On BMC  ${test_ipv6_addr}  ${test_prefix_length}
104
105    Modify IPv6 Address  ${test_ipv6_addr}  ${test_ipv6_addr1}  ${test_prefix_length}
106
107
108Verify Persistency Of IPv6 After BMC Reboot
109    [Documentation]  Verify persistency of IPv6 after BMC reboot.
110    [Tags]  Verify_Persistency_Of_IPv6_After_BMC_Reboot
111    [Teardown]  Run Keywords
112    ...  Delete IPv6 Address  ${test_ipv6_addr}  AND  Test Teardown Execution
113
114    Configure IPv6 Address On BMC  ${test_ipv6_addr}  ${test_prefix_length}
115
116    Redfish OBMC Reboot (off)  stack_mode=skip
117
118    # Verifying persistency of IPv6.
119    Verify IPv6 On BMC  ${test_ipv6_addr}
120
121
122Enable SLAAC On BMC And Verify
123    [Documentation]  Enable SLAAC on BMC and verify.
124    [Tags]  Enable_SLAAC_On_BMC_And_Verify
125
126    Set SLAAC Configuration State And Verify  ${True}
127
128
129Enable DHCPv6 Property On BMC And Verify
130    [Documentation]  Enable DHCPv6 property on BMC and verify.
131    [Tags]  Enable_DHCPv6_Property_On_BMC_And_Verify
132
133    Set And Verify DHCPv6 Property  Enabled
134
135
136Disable DHCPv6 Property On BMC And Verify
137    [Documentation]  Disable DHCPv6 property on BMC and verify.
138    [Tags]  Disable_DHCPv6_Property_On_BMC_And_Verify
139
140    Set And Verify DHCPv6 Property  Disabled
141
142
143Verify Persistency Of DHCPv6 On Reboot
144    [Documentation]  Verify persistency of DHCPv6 property on reboot.
145    [Tags]  Verify_Persistency_Of_DHCPv6_On_Reboot
146
147    Set And Verify DHCPv6 Property  Enabled
148    Redfish OBMC Reboot (off)       stack_mode=skip
149    Verify DHCPv6 Property          Enabled
150
151
152Configure Invalid Static IPv6 And Verify
153    [Documentation]  Configure invalid static IPv6 and verify.
154    [Tags]  Configure_Invalid_Static_IPv6_And_Verify
155    [Template]  Configure IPv6 Address On BMC
156
157    #invalid_ipv6            prefix length           valid_status_code
158    ${ipv4_hexword_addr}     ${test_prefix_length}   ${HTTP_BAD_REQUEST}
159    ${invalid_hexadec_ipv6}  ${test_prefix_length}   ${HTTP_BAD_REQUEST}
160    ${ipv6_multi_short}      ${test_prefix_length}   ${HTTP_BAD_REQUEST}
161
162
163
164Configure IPv6 Static Default Gateway And Verify
165    [Documentation]  Configure IPv6 static default gateway and verify.
166    [Tags]  Configure_IPv6_Static_Default_Gateway_And_Verify
167    [Template]  Configure IPv6 Static Default Gateway On BMC
168
169    # static_def_gw              prefix length           valid_status_code
170    ${ipv6_gw_addr}              ${prefix_length_def}    ${HTTP_OK}
171    ${invalid_staticv6_gateway}  ${test_prefix_length}   ${HTTP_BAD_REQUEST}
172
173
174Modify Static Default Gateway And Verify
175    [Documentation]  Modify static default gateway and verify.
176    [Tags]  Modify_Static_Default_Gateway_And_Verify
177    [Setup]  Configure IPv6 Static Default Gateway On BMC  ${ipv6_gw_addr}  ${prefix_length_def}
178
179    Modify IPv6 Static Default Gateway On BMC  ${test_ipv6_addr1}  ${prefix_length_def}  ${HTTP_OK}  ${ipv6_gw_addr}
180
181
182Delete IPv6 Static Default Gateway And Verify
183    [Documentation]  Delete IPv6 static default gateway and verify.
184    [Tags]  Delete_IPv6_Static_Default_Gateway_And_Verify
185    [Setup]  Configure IPv6 Static Default Gateway On BMC  ${ipv6_gw_addr}  ${prefix_length_def}
186
187    Delete IPv6 Static Default Gateway  ${ipv6_gw_addr}
188
189
190Verify Coexistence Of Linklocalv6 And Static IPv6 On BMC
191    [Documentation]  Verify linklocalv6 And static IPv6 both exist.
192    [Tags]  Verify_Coexistence_Of_Linklocalv6_And_Static_IPv6_On_BMC
193    [Setup]  Configure IPv6 Address On BMC  ${test_ipv6_addr}  ${test_prefix_length}
194    [Teardown]  Delete IPv6 Address  ${test_ipv6_addr}
195
196    Check Coexistence Of Linklocalv6 And Static IPv6
197
198
199Verify IPv6 Linklocal Address Is In Correct Format
200    [Documentation]  Verify linklocal address has network part as fe80 and
201    ...  host part as EUI64.
202    [Tags]  Verify_IPv6_Linklocal_Address_Is_In_Correct_Format
203
204    Check If Linklocal Address Is In Correct Format
205
206
207Verify BMC Gets SLAAC Address On Enabling SLAAC
208    [Documentation]  On enabling SLAAC verify SLAAC address comes up.
209    [Tags]  Verify_BMC_Gets_SLAAC_Address_On_Enabling_SLAAC
210    [Setup]  Set SLAAC Configuration State And Verify  ${False}
211
212    Set SLAAC Configuration State And Verify  ${True}
213    Sleep  ${NETWORK_TIMEOUT}
214    Check BMC Gets SLAAC Address
215
216
217Enable And Verify DHCPv6 Property On Eth1 When DHCPv6 Property Enabled On Eth0
218    [Documentation]  Verify DHCPv6 on eth1 when DHCPv6 property is enabled on eth0.
219    [Tags]  Enable_And_Verify_DHCPv6_Property_On_Eth1_When_DHCPv6_Property_Enabled_On_Eth0
220    [Setup]  Get The Initial DHCPv6 Settings
221    [Teardown]  Run Keywords  Set And Verify DHCPv6 Property  ${dhcpv6_channel_1}  ${1}
222    ...  AND  Set And Verify DHCPv6 Property  ${dhcpv6_channel_2}  ${2}
223
224    Set And Verify DHCPv6 Property  Enabled  ${1}
225    Set And Verify DHCPv6 Property  Enabled  ${2}
226
227
228Verify Enable And Disable SLAAC On Both Interfaces
229    [Documentation]  Verify enable and disable SLAAC on both the interfaces.
230    [Tags]  Verify_Enable_And_Disable_SLAAC_On_Both_Interfaces
231    [Setup]  Get The Initial SLAAC Settings
232    [Template]  Set And Verify SLAAC Property On Both Interfaces
233    [Teardown]  Run Keywords  Set SLAAC Configuration State And Verify  ${slaac_channel_1}  [${HTTP_OK}]  ${1}
234    ...  AND  Set SLAAC Configuration State And Verify  ${slaac_channel_2}  [${HTTP_OK}]  ${2}
235
236    # slaac_eth0       slaac_eth1
237    ${True}            ${True}
238    ${True}            ${False}
239    ${False}           ${True}
240    ${False}           ${False}
241
242
243Verify Autoconfig Is Present On Ethernet Interface
244    [Documentation]  Verify autoconfig is present on ethernet interface.
245    [Tags]  Verify_Autoconfig_Is_Present_On_Ethernet_Interface
246
247    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}
248    Should Contain  ${resp.dict}  StatelessAddressAutoConfig
249
250
251Verify Interface ID Of SLAAC And LinkLocal Addresses Are Same
252    [Documentation]  Validate interface id of SLAAC and link-local addresses are same.
253    [Tags]  Verify_Interface_ID_Of_SLAAC_And_LinkLocal_Addresses_Are_Same
254
255    @{ipv6_addressorigin_list}  ${ipv6_linklocal_addr}=  Get Address Origin List And Address For Type  LinkLocal
256    @{ipv6_addressorigin_list}  ${ipv6_slaac_addr}=  Get Address Origin List And Address For Type  SLAAC
257
258    ${linklocal_interface_id}=  Get Interface ID Of IPv6  ${ipv6_linklocal_addr}
259    ${slaac_interface_id}=  Get Interface ID Of IPv6  ${ipv6_slaac_addr}
260
261    Should Be Equal    ${linklocal_interface_id}    ${slaac_interface_id}
262
263
264Verify Persistency Of Link Local IPv6 On BMC Reboot
265    [Documentation]  Verify persistency of link local on BMC reboot.
266    [Tags]  Verify_Persistency_Of_Link_Local_IPv6_On_BMC_Reboot
267
268    # Capturing the linklocal before reboot.
269    @{ipv6_address_origin_list}  ${linklocal_addr_before_reboot}=
270    ...  Get Address Origin List And Address For Type  LinkLocal
271
272    # Rebooting BMC.
273    Redfish OBMC Reboot (off)  stack_mode=skip
274
275    @{ipv6_address_origin_list}  ${linklocal_addr_after_reboot}=
276    ...  Get Address Origin List And Address For Type  LinkLocal
277
278    # Verifying the linklocal must be the same before and after reboot.
279    Should Be Equal    ${linklocal_addr_before_reboot}    ${linklocal_addr_after_reboot}
280    ...    msg=IPv6 Linklocal address has changed after reboot.
281
282
283Modify MAC and Verify BMC Reinitializing Linklocal
284    [Documentation]  Modify MAC and verify BMC reinitializing linklocal.
285    [Tags]  Modify_MAC_and_Verify_BMC_Reinitializing_Linklocal
286    [Teardown]  Configure MAC Settings  ${original_address}
287
288    ${original_address}=  Get BMC MAC Address
289    @{ipv6_addressorigin_list}  ${ipv6_before_linklocal_addr}=  Get Address Origin List And Address For Type  LinkLocal
290
291    # Modify MAC Address Of Ethernet Interface.
292    Configure MAC Settings  ${new_mac_addr}
293    Sleep  30s
294    Wait For Host To Ping  ${OPENBMC_HOST}  ${NETWORK_TIMEOUT}
295    @{ipv6_addressorigin_list}  ${ipv6_linklocal_after_addr}=  Get Address Origin List And Address For Type  LinkLocal
296
297    # Verify whether the linklocal has changed and is in the the correct format.
298    Check If Linklocal Address Is In Correct Format
299    Should Not Be Equal    ${ipv6_before_linklocal_addr}    ${ipv6_linklocal_after_addr}
300
301
302Add Multiple IPv6 Address And Verify
303    [Documentation]  Add multiple IPv6 address and verify.
304    [Tags]  Add_Multiple_IPv6_Address_And_Verify
305    [Teardown]  Run Keywords
306    ...  Delete IPv6 Address  ${test_ipv6_addr}  AND  Delete IPv6 Address  ${test_ipv6_addr1}
307    ...  AND  Test Teardown Execution
308
309    Configure Multiple IPv6 Address on BMC  ${test_prefix_length}
310
311
312Verify Coexistence Of Static IPv6 And SLAAC On BMC
313    [Documentation]  Verify static IPv6 And SLAAC both coexist.
314    [Tags]  Verify_Coexistence_Of_Static_IPv6_And_SLAAC_On_BMC
315    [Setup]  Configure IPv6 Address On BMC  ${test_ipv6_addr}  ${test_prefix_length}
316             Set SLAAC Configuration State And Verify  ${True}
317    [Teardown]  Delete IPv6 Address  ${test_ipv6_addr}
318
319    Sleep  ${NETWORK_TIMEOUT}s
320
321    Check Coexistence Of Static IPv6 And SLAAC
322
323
324Verify Coexistence Of Link Local And DHCPv6 On BMC
325    [Documentation]  Verify link local And dhcpv6 both coexist.
326    [Tags]  Verify_Coexistence_Of_Link_Local_And_DHCPv6_On_BMC
327    [Setup]  Set DHCPv6 Property  Enabled  ${2}
328
329    Sleep  ${NETWORK_TIMEOUT}s
330
331    Check Coexistence Of Link Local And DHCPv6
332
333
334Verify Coexistence Of Link Local And SLAAC On BMC
335    [Documentation]  Verify link local And SLAAC both coexist.
336    [Tags]  Verify_Coexistence_Of_Link_Local_And_SLAAC_On_BMC
337    [Setup]  Set SLAAC Configuration State And Verify  ${True}
338
339    Sleep  ${NETWORK_TIMEOUT}s
340
341    Check Coexistence Of Link Local And SLAAC
342
343
344Verify Coexistence Of All IPv6 Type Addresses On BMC
345    [Documentation]  Verify coexistence of link local, static, DHCPv6 and SLAAC ipv6 addresses.
346    [Tags]  Verify_Coexistence_Of_All_IPv6_Type_Addresses_On_BMC
347    [Setup]  Run Keywords  Configure IPv6 Address On BMC  ${test_ipv6_addr}  ${test_prefix_length}
348    ...      AND  Get The Initial DHCPv6 Setting On Each Interface  ${1}
349    ...      AND  Set And Verify DHCPv6 Property  Enabled
350    ...      AND  Get The Initial SLAAC Setting On Each Interface  ${1}
351    ...      AND  Set SLAAC Configuration State And Verify  ${True}
352    [Teardown]  Run Keywords  Delete IPv6 Address  ${test_ipv6_addr}
353    ...         AND  Set And Verify DHCPv6 Property  ${dhcpv6_channel_1}  ${1}
354    ...         AND  Set SLAAC Configuration State And Verify  ${slaac_channel_1}  [${HTTP_OK}]  ${1}
355
356    Sleep  ${NETWORK_TIMEOUT}s
357
358    # Verify link local, static, DHCPv6 and SLAAC ipv6 addresses coexist.
359    Verify The Coexistence Of The Address Type  LinkLocal  Static  DHCPv6  SLAAC
360
361
362Configure Link Local IPv6 Address And Verify
363    [Documentation]  Configure link local IPv6 address and verify.
364    [Tags]  Configure_Link_Local_IPv6_Address_And_Verify
365
366    Configure IPv6 Address On BMC  ${link_local_addr}  ${link_local_prefix_len}
367
368    # Verify the address origin contains link local.
369    @{ipv6_address_origin_list}  ${ipv6_link_local_addr}=
370    ...    Get Address Origin List And Address For Type  LinkLocal
371
372    ${count}=  Evaluate  ${ipv6_address_origin_list}.count("LinkLocal")
373
374    Should Be Equal As Integers  ${count}  2
375
376
377*** Keywords ***
378
379Suite Setup Execution
380    [Documentation]  Do suite setup execution.
381
382    Redfish.Login
383    ${active_channel_config}=  Get Active Channel Config
384    Set Suite Variable  ${active_channel_config}
385
386    ${ethernet_interface}=  Set Variable  ${active_channel_config['${CHANNEL_NUMBER}']['name']}
387
388    Set Suite variable  ${ethernet_interface}
389
390    # Get initial IPv4 and IPv6 addresses and address origins for eth0.
391    ${initial_ipv4_addressorigin_list}  ${initial_ipv4_addr_list}=  Get Address Origin List And IPv4 or IPv6 Address  IPv4Addresses
392    ${initial_ipv6_addressorigin_list}  ${initial_ipv6_addr_list}=  Get Address Origin List And IPv4 or IPv6 Address  IPv6Addresses
393
394    Set Suite Variable   ${initial_ipv4_addressorigin_list}
395    Set Suite Variable   ${initial_ipv4_addr_list}
396    Set Suite Variable   ${initial_ipv6_addressorigin_list}
397    Set Suite Variable   ${initial_ipv6_addr_list}
398
399    # Get initial IPv4 and IPv6 addresses and address origins for eth1.
400    ${eth1_initial_ipv4_addressorigin_list}  ${eth1_initial_ipv4_addr_list}=
401    ...  Get Address Origin List And IPv4 or IPv6 Address  IPv4Addresses  ${2}
402    ${eth1_initial_ipv6_addressorigin_list}  ${eth1_initial_ipv6_addr_list}=
403    ...  Get Address Origin List And IPv4 or IPv6 Address  IPv6Addresses  ${2}
404    Set Suite Variable   ${eth1_initial_ipv4_addressorigin_list}
405    Set Suite Variable   ${eth1_initial_ipv4_addr_list}
406    Set Suite Variable   ${eth1_initial_ipv6_addressorigin_list}
407    Set Suite Variable   ${eth1_initial_ipv6_addr_list}
408
409
410Test Setup Execution
411    [Documentation]  Test setup execution.
412
413    @{ipv6_network_configurations}=  Get IPv6 Network Configuration
414    Set Test Variable  @{ipv6_network_configurations}
415
416    # Get BMC IPv6 address and prefix length.
417    ${ipv6_data}=  Get BMC IPv6 Info
418    Set Test Variable  ${ipv6_data}
419
420
421Test Teardown Execution
422    [Documentation]  Test teardown execution.
423
424    FFDC On Test Case Fail
425
426
427Get IPv6 Network Configuration
428    [Documentation]  Get Ipv6 network configuration.
429    # Sample output:
430    # {
431    #  "@odata.id": "/redfish/v1/Managers/${MANAGER_ID}/EthernetInterfaces/eth0",
432    #  "@odata.type": "#EthernetInterface.v1_4_1.EthernetInterface",
433    #   "DHCPv4": {
434    #    "DHCPEnabled": false,
435    #    "UseDNSServers": false,
436    #    "UseDomainName": true,
437    #    "UseNTPServers": false
438    #  },
439    #  "DHCPv6": {
440    #    "OperatingMode": "Disabled",
441    #    "UseDNSServers": false,
442    #    "UseDomainName": true,
443    #    "UseNTPServers": false
444    #  },
445    #  "Description": "Management Network Interface",
446    #  "FQDN": "localhost",
447    #  "HostName": "localhost",
448    #  "IPv4Addresses": [
449    #    {
450    #      "Address": "xx.xx.xx.xx",
451    #      "AddressOrigin": "Static",
452    #      "Gateway": "xx.xx.xx.1",
453    #      "SubnetMask": "xx.xx.xx.0"
454    #    },
455    #    {
456    #      "Address": "169.254.xx.xx",
457    #      "AddressOrigin": "IPv4LinkLocal",
458    #      "Gateway": "0.0.0.0",
459    #      "SubnetMask": "xx.xx.0.0"
460    #    },
461    #  ],
462    #  "IPv4StaticAddresses": [
463    #    {
464    #      "Address": "xx.xx.xx.xx",
465    #      "AddressOrigin": "Static",
466    #      "Gateway": "xx.xx.xx.1",
467    #      "SubnetMask": "xx.xx.0.0"
468    #    }
469    # }
470    #  ],
471    #  "IPv6AddressPolicyTable": [],
472    #  "IPv6Addresses": [
473    #    {
474    #      "Address": "fe80::xxxx:xxxx:xxxx:xxxx",
475    #      "AddressOrigin": "LinkLocal",
476    #      "AddressState": null,
477    #      "PrefixLength": xx
478    #    }
479    #  ],
480    #  "IPv6DefaultGateway": "",
481    #  "IPv6StaticAddresses": [
482    #    { "Address": "xxxx:xxxx:xxxx:xxxx::xxxx",
483    #      "AddressOrigin": "Static",
484    #      "AddressState": null,
485    #      "PrefixLength": xxx
486    #    }
487    #  ],
488    #  "Id": "eth0",
489    #  "InterfaceEnabled": true,
490    #  "LinkStatus": "LinkUp",
491    #  "MACAddress": "xx:xx:xx:xx:xx:xx",
492    #  "Name": "Manager Ethernet Interface",
493    #  "NameServers": [],
494    #  "SpeedMbps": 0,
495    #  "StaticNameServers": [],
496    #  "Status": {
497    #    "Health": "OK",
498    #    "HealthRollup": "OK",
499    #    "State": "Enabled"
500    #  },
501    #  "VLANs": {
502    #    "@odata.id": "/redfish/v1/Managers/${MANAGER_ID}/EthernetInterfaces/eth0/VLANs"
503
504
505    ${active_channel_config}=  Get Active Channel Config
506    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH_IFACE}${active_channel_config['${CHANNEL_NUMBER}']['name']}
507
508    @{ipv6_network_configurations}=  Get From Dictionary  ${resp.dict}  IPv6StaticAddresses
509    RETURN  @{ipv6_network_configurations}
510
511
512Verify IPv6 And PrefixLength
513    [Documentation]  Verify IPv6 address and prefix length on BMC.
514    [Arguments]  ${ipv6_addr}  ${prefix_len}
515
516    # Description of the argument(s):
517    # ipv6_addr   IPv6 address to be verified.
518    # prefix_len  PrefixLength value to be verified.
519
520    # Catenate IPv6 address and its prefix length.
521    ${ipv6_with_prefix}=  Catenate  ${ipv6_addr}/${prefix_len}
522
523    # Get IPv6 address details on BMC using IP command.
524    @{ip_data}=  Get BMC IPv6 Info
525
526    # Verify if IPv6 and prefix length is configured on BMC.
527
528    Should Contain  ${ip_data}  ${ipv6_with_prefix}
529    ...  msg=IPv6 and prefix length pair does not exist.
530
531
532Configure IPv6 Address On BMC
533    [Documentation]  Add IPv6 Address on BMC.
534    [Arguments]  ${ipv6_addr}  ${prefix_len}  ${valid_status_codes}=${HTTP_OK}
535
536    # Description of argument(s):
537    # ipv6_addr           IPv6 address to be added (e.g. "2001:EEEE:2222::2022").
538    # prefix_len          Prefix length for the IPv6 to be added
539    #                     (e.g. "64").
540    # valid_status_codes  Expected return code from patch operation
541    #                     (e.g. "200").
542
543    ${prefix_length}=  Convert To Integer  ${prefix_len}
544    ${empty_dict}=  Create Dictionary
545    ${ipv6_data}=  Create Dictionary  Address=${ipv6_addr}
546    ...  PrefixLength=${prefix_length}
547
548    ${patch_list}=  Create List
549
550    # Get existing static IPv6 configurations on BMC.
551    ${ipv6_network_configurations}=  Get IPv6 Network Configuration
552    ${num_entries}=  Get Length  ${ipv6_network_configurations}
553
554    FOR  ${INDEX}  IN RANGE  0  ${num_entries}
555      Append To List  ${patch_list}  ${empty_dict}
556    END
557
558    ${valid_status_codes}=  Set Variable If  '${valid_status_codes}' == '${HTTP_OK}'
559    ...  ${HTTP_OK},${HTTP_NO_CONTENT}
560    ...  ${valid_status_codes}
561
562    # We need not check for existence of IPv6 on BMC while adding.
563    Append To List  ${patch_list}  ${ipv6_data}
564    ${data}=  Create Dictionary  IPv6StaticAddresses=${patch_list}
565
566    ${active_channel_config}=  Get Active Channel Config
567    ${ethernet_interface}=  Set Variable  ${active_channel_config['${CHANNEL_NUMBER}']['name']}
568
569    Redfish.patch  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}  body=&{data}
570    ...  valid_status_codes=[${valid_status_codes}]
571
572    Return From Keyword If  '${valid_status_codes}' != '${HTTP_OK},${HTTP_NO_CONTENT}'
573
574    # Note: Network restart takes around 15-18s after patch request processing.
575    Sleep  ${NETWORK_TIMEOUT}s
576    Wait For Host To Ping  ${OPENBMC_HOST}  ${NETWORK_TIMEOUT}
577
578    Verify IPv6 And PrefixLength  ${ipv6_addr}  ${prefix_len}
579
580    # Verify if existing static IPv6 addresses still exist.
581    FOR  ${ipv6_network_configuration}  IN  @{ipv6_network_configurations}
582      Verify IPv6 On BMC  ${ipv6_network_configuration['Address']}
583    END
584
585    Validate IPv6 Network Config On BMC
586
587
588Configure Multiple IPv6 Address on BMC
589    [Documentation]  Add multiple IPv6 address on BMC.
590    [Arguments]  ${prefix_len}
591    ...          ${valid_status_codes}=[${HTTP_OK},${HTTP_NO_CONTENT}]
592
593    # Description of argument(s):
594    # prefix_len          Prefix length for the IPv6 to be added
595    #                     (e.g. "64").
596    # valid_status_codes  Expected return code from patch operation
597    #                     (e.g. "200").
598
599    ${ipv6_list}=  Create List  ${test_ipv6_addr}  ${test_ipv6_addr1}
600    ${prefix_length}=  Convert To Integer  ${prefix_len}
601    ${empty_dict}=  Create Dictionary
602    ${patch_list}=  Create List
603
604    # Get existing static IPv6 configurations on BMC.
605    ${ipv6_network_configurations}=  Get IPv6 Network Configuration
606    ${num_entries}=  Get Length  ${ipv6_network_configurations}
607
608    FOR  ${INDEX}  IN RANGE  0  ${num_entries}
609      Append To List  ${patch_list}  ${empty_dict}
610    END
611
612    # We need not check for existence of IPv6 on BMC while adding.
613    FOR  ${ipv6_addr}  IN  @{ipv6_list}
614      ${ipv6_data}=  Create Dictionary  Address=${ipv6_addr}  PrefixLength=${prefix_length}
615      Append To List  ${patch_list}  ${ipv6_data}
616    END
617    ${data}=  Create Dictionary  IPv6StaticAddresses=${patch_list}
618
619    ${active_channel_config}=  Get Active Channel Config
620    ${ethernet_interface}=  Set Variable  ${active_channel_config['${CHANNEL_NUMBER}']['name']}
621
622    Redfish.patch  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}  body=&{data}
623    ...  valid_status_codes=${valid_status_codes}
624
625    IF  ${valid_status_codes} != [${HTTP_OK}, ${HTTP_NO_CONTENT}]
626        Fail  msg=Static address not added correctly
627    END
628
629    # Note: Network restart takes around 15-18s after patch request processing.
630    Sleep  ${NETWORK_TIMEOUT}s
631    Wait For Host To Ping  ${OPENBMC_HOST}  ${NETWORK_TIMEOUT}
632
633    # Verify newly added ip address on CLI.
634    FOR  ${ipv6_addr}  IN  @{ipv6_list}
635      Verify IPv6 And PrefixLength  ${ipv6_addr}  ${prefix_len}
636    END
637
638    # Verify if existing static IPv6 addresses still exist.
639    FOR  ${ipv6_network_configuration}  IN  @{ipv6_network_configurations}
640      Verify IPv6 On BMC  ${ipv6_network_configuration['Address']}
641    END
642
643    # Get the latest ipv6 network configurations.
644    @{ipv6_network_configurations}=  Get IPv6 Network Configuration
645
646    # Verify newly added ip address on BMC.
647    FOR  ${ipv6_network_configuration}  IN  @{ipv6_network_configurations}
648      Should Contain Match  ${ipv6_list}  ${ipv6_network_configuration['Address']}
649    END
650
651    Validate IPv6 Network Config On BMC
652
653
654Validate IPv6 Network Config On BMC
655    [Documentation]  Check that IPv6 network info obtained via redfish matches info
656    ...              obtained via CLI.
657
658    @{ipv6_network_configurations}=  Get IPv6 Network Configuration
659    ${ipv6_data}=  Get BMC IPv6 Info
660    FOR  ${ipv6_network_configuration}  IN  @{ipv6_network_configurations}
661      Should Contain Match  ${ipv6_data}  ${ipv6_network_configuration['Address']}/*
662      ...  msg=IPv6 address does not exist.
663    END
664
665
666Delete IPv6 Address
667    [Documentation]  Delete IPv6 address of BMC.
668    [Arguments]  ${ipv6_addr}
669    ...          ${valid_status_codes}=[${HTTP_OK},${HTTP_ACCEPTED},${HTTP_NO_CONTENT}]
670
671    # Description of argument(s):
672    # ipv6_addr           IPv6 address to be deleted (e.g. "2001:1234:1234:1234::1234").
673    # valid_status_codes  Expected return code from patch operation
674    #                     (e.g. "200").  See prolog of rest_request
675    #                     method in redfish_plus.py for details.
676
677    ${empty_dict}=  Create Dictionary
678    ${patch_list}=  Create List
679
680    @{ipv6_network_configurations}=  Get IPv6 Network Configuration
681    FOR  ${ipv6_network_configuration}  IN  @{ipv6_network_configurations}
682        IF  '${ipv6_network_configuration['Address']}' == '${ipv6_addr}'
683            Append To List  ${patch_list}  ${null}
684        ELSE
685            Append To List  ${patch_list}  ${empty_dict}
686        END
687    END
688
689    ${ip_found}=  Run Keyword And Return Status  List Should Contain Value
690    ...  ${patch_list}  ${null}  msg=${ipv6_addr} does not exist on BMC
691    Pass Execution If  ${ip_found} == ${False}  ${ipv6_addr} does not exist on BMC
692
693    # Run patch command only if given IP is found on BMC
694    ${data}=  Create Dictionary  IPv6StaticAddresses=${patch_list}
695
696    ${active_channel_config}=  Get Active Channel Config
697    ${ethernet_interface}=  Set Variable  ${active_channel_config['${CHANNEL_NUMBER}']['name']}
698
699    Redfish.patch  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}  body=&{data}
700    ...  valid_status_codes=${valid_status_codes}
701
702    # Note: Network restart takes around 15-18s after patch request processing
703    Sleep  ${NETWORK_TIMEOUT}s
704    Wait For Host To Ping  ${OPENBMC_HOST}  ${NETWORK_TIMEOUT}
705
706    # IPv6 address that is deleted should not be there on BMC.
707    ${delete_status}=  Run Keyword And Return Status  Verify IPv6 On BMC  ${ipv6_addr}
708    IF  '${valid_status_codes}' == '[${HTTP_OK},${HTTP_ACCEPTED},${HTTP_NO_CONTENT}]'
709        Should Be True  '${delete_status}' == '${False}'
710    ELSE
711        Should Be True  '${delete_status}' == '${True}'
712    END
713
714    Validate IPv6 Network Config On BMC
715
716
717Modify IPv6 Address
718    [Documentation]  Modify and verify IPv6 address of BMC.
719    [Arguments]  ${ipv6}  ${new_ipv6}  ${prefix_len}
720    ...  ${valid_status_codes}=[${HTTP_OK}, ${HTTP_NO_CONTENT}]
721
722    # Description of argument(s):
723    # ipv6                  IPv6 address to be replaced (e.g. "2001:AABB:CCDD::AAFF").
724    # new_ipv6              New IPv6 address to be configured.
725    # prefix_len            Prefix length value (Range 1 to 128).
726    # valid_status_codes    Expected return code from patch operation
727    #                       (e.g. "200", "201").
728
729    ${empty_dict}=  Create Dictionary
730    ${patch_list}=  Create List
731    ${prefix_length}=  Convert To Integer  ${prefix_len}
732    ${ipv6_data}=  Create Dictionary
733    ...  Address=${new_ipv6}  PrefixLength=${prefix_length}
734
735    # Sample IPv6 network configurations:
736    #  "IPv6AddressPolicyTable": [],
737    #  "IPv6Addresses": [
738    #    {
739    #      "Address": "X002:db8:0:2::XX0",
740    #      "AddressOrigin": "DHCPv6",
741    #      "PrefixLength": 128
742    #    },
743    #    {
744    #      "Address": “X002:db8:0:2:a94:XXff:fe82:XXXX",
745    #      "AddressOrigin": "SLAAC",
746    #      "PrefixLength": 64
747    #    },
748    #    {
749    #      "Address": “Y002:db8:0:2:a94:efff:fe82:5000",
750    #      "AddressOrigin": "Static",
751    #      "PrefixLength": 56
752    #    },
753    #    {
754    #      "Address": “Z002:db8:0:2:a94:efff:fe82:5000",
755    #      "AddressOrigin": "Static",
756    #      "PrefixLength": 56
757    #    },
758    #    {
759    #      "Address": “Xe80::a94:efff:YYYY:XXXX",
760    #      "AddressOrigin": "LinkLocal",
761    #      "PrefixLength": 64
762    #    },
763    #    {
764    #     "Address": “X002:db8:1:2:eff:233:fee:546",
765    #      "AddressOrigin": "Static",
766    #      "PrefixLength": 56
767    #    }
768    #  ],
769    #  "IPv6DefaultGateway": “XXXX::ab2e:80fe:87df:XXXX”,
770    #  "IPv6StaticAddresses": [
771    #    {
772    #      "Address": “X002:db8:0:2:a94:efff:fe82:5000",
773    #      "PrefixLength": 56
774    #    },
775    #    {
776    #      "Address": “Y002:db8:0:2:a94:efff:fe82:5000",
777    #      "PrefixLength": 56
778    #    },
779    #    {
780    #      "Address": “Z002:db8:1:2:eff:233:fee:546",
781    #      "PrefixLength": 56
782    #    }
783    #  ],
784    #  "IPv6StaticDefaultGateways": [],
785
786    # Find the position of IPv6 address to be modified.
787    @{ipv6_network_configurations}=  Get IPv6 Network Configuration
788    FOR  ${ipv6_network_configuration}  IN  @{ipv6_network_configurations}
789      IF  '${ipv6_network_configuration['Address']}' == '${ipv6}'
790          Append To List  ${patch_list}  ${ipv6_data}
791      ELSE
792          Append To List  ${patch_list}  ${empty_dict}
793      END
794    END
795
796    # Modify the IPv6 address only if given IPv6 is found
797    ${ip_found}=  Run Keyword And Return Status  List Should Contain Value
798    ...  ${patch_list}  ${ipv6_data}  msg=${ipv6} does not exist on BMC
799    Pass Execution If  ${ip_found} == ${False}  ${ipv6} does not exist on BMC
800
801    ${data}=  Create Dictionary  IPv6StaticAddresses=${patch_list}
802
803    ${active_channel_config}=  Get Active Channel Config
804    ${ethernet_interface}=  Set Variable  ${active_channel_config['${CHANNEL_NUMBER}']['name']}
805
806    Redfish.patch  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}
807    ...  body=&{data}  valid_status_codes=${valid_status_codes}
808
809    # Note: Network restart takes around 15-18s after patch request processing.
810    Sleep  ${NETWORK_TIMEOUT}s
811    Wait For Host To Ping  ${OPENBMC_HOST}  ${NETWORK_TIMEOUT}
812
813    # Verify if new IPv6 address is configured on BMC.
814    Verify IPv6 On BMC  ${new_ipv6}
815
816    # Verify if old IPv6 address is erased.
817    ${cmd_status}=  Run Keyword And Return Status
818    ...  Verify IPv6 On BMC  ${ipv6}
819    Should Be Equal  ${cmd_status}  ${False}  msg=Old IPv6 address is not deleted.
820
821    Validate IPv6 Network Config On BMC
822
823
824Set SLAAC Configuration State And Verify
825    [Documentation]  Set SLAAC configuration state and verify.
826    [Arguments]  ${slaac_state}  ${valid_status_codes}=[${HTTP_OK},${HTTP_ACCEPTED},${HTTP_NO_CONTENT}]
827    ...  ${channel_number}=${CHANNEL_NUMBER}
828
829    # Description of argument(s):
830    # slaac_state         SLAAC state('True' or 'False').
831    # valid_status_code   Expected valid status codes.
832    # channel_number      Channel number 1(eth0) or 2(eth1).
833
834    ${active_channel_config}=  Get Active Channel Config
835    ${ethernet_interface}=  Set Variable  ${active_channel_config['${CHANNEL_NUMBER}']['name']}
836
837    ${data}=  Set Variable If  ${slaac_state} == ${False}  ${DISABLE_SLAAC}  ${ENABLE_SLAAC}
838    ${resp}=  Redfish.Patch  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}
839    ...  body=${data}  valid_status_codes=${valid_status_codes}
840
841    # Verify SLAAC is set correctly.
842    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}
843    ${slaac_verify}=  Get From Dictionary  ${resp.dict}  StatelessAddressAutoConfig
844
845    IF  '${slaac_verify['IPv6AutoConfigEnabled']}' != '${slaac_state}'
846        Fail  msg=SLAAC not set properly.
847    END
848
849Set And Verify DHCPv6 Property
850    [Documentation]  Set DHCPv6 property and verify.
851    [Arguments]  ${dhcpv6_operating_mode}=${Disabled}  ${channel_number}=${CHANNEL_NUMBER}
852
853    # Description of argument(s):
854    # dhcpv6_operating_mode    Enabled if user wants to enable DHCPv6('Enabled' or 'Disabled').
855    # channel_number           Channel number 1 or 2.
856
857    Set DHCPv6 Property  ${dhcpv6_operating_mode}  ${channel_number}
858    Verify DHCPv6 Property  ${dhcpv6_operating_mode}  ${channel_number}
859
860
861Set DHCPv6 Property
862    [Documentation]  Set DHCPv6 attribute is enables or disabled.
863    [Arguments]  ${dhcpv6_operating_mode}=${Disabled}  ${channel_number}=${CHANNEL_NUMBER}
864
865    # Description of argument(s):
866    # dhcpv6_operating_mode    Enabled if user wants to enable DHCPv6('Enabled' or 'Disabled').
867    # channel_number           Channel number 1 or 2.
868
869    ${data}=  Set Variable If  '${dhcpv6_operating_mode}' == 'Disabled'  ${DISABLE_DHCPv6}  ${ENABLE_DHCPv6}
870    ${ethernet_interface}=  Set Variable  ${active_channel_config['${CHANNEL_NUMBER}']['name']}
871
872    Redfish.Patch  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}
873    ...  body=${data}  valid_status_codes=[${HTTP_OK},${HTTP_NO_CONTENT}]
874
875
876Verify DHCPv6 Property
877    [Documentation]  Verify DHCPv6 settings is enabled or disabled.
878    [Arguments]  ${dhcpv6_operating_mode}  ${channel_number}=${CHANNEL_NUMBER}
879
880    # Description of Argument(s):
881    # dhcpv6_operating_mode  Enable/ Disable DHCPv6.
882    # channel_number         Channel number 1 or 2.
883
884    ${ethernet_interface}=  Set Variable  ${active_channel_config['${CHANNEL_NUMBER}']['name']}
885
886    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}
887    ${dhcpv6_verify}=  Get From Dictionary  ${resp.dict}  DHCPv6
888
889    Should Be Equal  '${dhcpv6_verify['OperatingMode']}'  '${dhcpv6_operating_mode}'
890
891
892Get IPv6 Static Default Gateway
893    [Documentation]  Get IPv6 static default gateway.
894
895    ${active_channel_config}=  Get Active Channel Config
896    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH_IFACE}${active_channel_config['${CHANNEL_NUMBER}']['name']}
897
898    @{ipv6_static_defgw_configurations}=  Get From Dictionary  ${resp.dict}  IPv6StaticDefaultGateways
899    RETURN  @{ipv6_static_defgw_configurations}
900
901
902Configure IPv6 Static Default Gateway On BMC
903    [Documentation]  Configure IPv6 static default gateway on BMC.
904    [Arguments]  ${ipv6_gw_addr}  ${prefix_length_def}
905    ...  ${valid_status_codes}=${HTTP_OK}
906
907    # Description of argument(s):
908    # ipv6_gw_addr          IPv6 Static Default Gateway address to be configured.
909    # prefix_len_def        Prefix length value (Range 1 to 128).
910    # valid_status_codes    Expected return code from patch operation
911    #                       (e.g. "200", "204".)
912
913    # Prefix Length is passed as None.
914    IF   '${prefix_length_def}' == '${None}'
915        ${ipv6_gw}=  Create Dictionary  Address=${ipv6_gw_addr}
916    ELSE
917        ${ipv6_gw}=  Create Dictionary  Address=${ipv6_gw_addr}  Prefix Length=${prefix_length_def}
918    END
919
920    ${ipv6_static_def_gw}=  Get IPv6 Static Default Gateway
921
922    ${num_entries}=  Get Length  ${ipv6_static_def_gw}
923
924    ${patch_list}=  Create List
925    ${empty_dict}=  Create Dictionary
926
927    FOR  ${INDEX}  IN RANGE  0  ${num_entries}
928      Append To List  ${patch_list}  ${empty_dict}
929    END
930
931    ${valid_status_codes}=  Set Variable If  '${valid_status_codes}' == '${HTTP_OK}'
932    ...  ${HTTP_OK},${HTTP_NO_CONTENT}
933    ...  ${valid_status_codes}
934
935    Append To List  ${patch_list}  ${ipv6_gw}
936    ${data}=  Create Dictionary  IPv6StaticDefaultGateways=${patch_list}
937
938    Redfish.Patch  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}
939    ...  body=${data}  valid_status_codes=[${valid_status_codes}]
940
941    # Verify the added static default gateway is present in Redfish Get Output.
942    ${ipv6_staticdef_gateway}=  Get IPv6 Static Default Gateway
943
944    ${ipv6_static_def_gw_list}=  Create List
945    FOR  ${ipv6_staticdef_gateway}  IN  @{ipv6_staticdef_gateway}
946        ${value}=    Get From Dictionary    ${ipv6_staticdef_gateway}    Address
947        Append To List  ${ipv6_static_def_gw_list}  ${value}
948    END
949
950    IF  '${valid_status_codes}' != '${HTTP_OK},${HTTP_NO_CONTENT}'
951        Should Not Contain  ${ipv6_static_def_gw_list}  ${ipv6_gw_addr}
952    ELSE
953        Should Contain  ${ipv6_static_def_gw_list}  ${ipv6_gw_addr}
954    END
955
956
957Modify IPv6 Static Default Gateway On BMC
958    [Documentation]  Modify and verify IPv6 address of BMC.
959    [Arguments]  ${ipv6_gw_addr}  ${new_static_def_gw}  ${prefix_length}
960    ...  ${valid_status_codes}=[${HTTP_OK},${HTTP_ACCEPTED}]
961
962    # Description of argument(s):
963    # ipv6_gw_addr          IPv6 static default gateway address to be replaced (e.g. "2001:AABB:CCDD::AAFF").
964    # new_static_def_gw     New static default gateway address to be configured.
965    # prefix_length         Prefix length value (Range 1 to 128).
966    # valid_status_codes    Expected return code from patch operation
967    #                       (e.g. "200", "204").
968
969    ${empty_dict}=  Create Dictionary
970    ${patch_list}=  Create List
971    # Prefix Length is passed as None.
972    IF   '${prefix_length_def}' == '${None}'
973        ${modified_ipv6_gw_addripv6_data}=  Create Dictionary  Address=${new_static_def_gw}
974    ELSE
975        ${modified_ipv6_gw_addripv6_data}=  Create Dictionary  Address=${new_static_def_gw}  Prefix Length=${prefix_length_def}
976    END
977
978    @{ipv6_static_def_gw_list}=  Get IPv6 Static Default Gateway
979
980    FOR  ${ipv6_static_def_gw}  IN  @{ipv6_static_def_gw_list}
981      IF  '${ipv6_static_def_gw['Address']}' == '${ipv6_gw_addr}'
982          Append To List  ${patch_list}  ${modified_ipv6_gw_addripv6_data}
983      ELSE
984          Append To List  ${patch_list}  ${empty_dict}
985      END
986    END
987
988    # Modify the IPv6 address only if given IPv6 static default gateway is found.
989    ${ip_static_def_gw_found}=  Run Keyword And Return Status  List Should Contain Value
990    ...  ${patch_list}  ${modified_ipv6_gw_addripv6_data}  msg=${ipv6_gw_addr} does not exist on BMC
991    Pass Execution If  ${ip_static_def_gw_found} == ${False}  ${ipv6_gw_addr} does not exist on BMC
992
993    ${data}=  Create Dictionary  IPv6StaticDefaultGateways=${patch_list}
994
995    Redfish.Patch  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}
996    ...  body=&{data}  valid_status_codes=${valid_status_codes}
997
998    ${ipv6_staticdef_gateway}=  Get IPv6 Static Default Gateway
999
1000    ${ipv6_static_def_gw_list}=  Create List
1001    FOR  ${ipv6_staticdef_gateway}  IN  @{ipv6_staticdef_gateway}
1002        ${value}=  Get From Dictionary  ${ipv6_staticdef_gateway}  Address
1003        Append To List  ${ipv6_static_def_gw_list}  ${value}
1004    END
1005
1006    Should Contain  ${ipv6_static_def_gw_list}  ${new_static_def_gw}
1007    # Verify if old static default gateway address is erased.
1008    Should Not Contain  ${ipv6_static_def_gw_list}  ${ipv6_gw_addr}
1009
1010
1011Delete IPv6 Static Default Gateway
1012    [Documentation]  Delete IPv6 static default gateway on BMC.
1013    [Arguments]  ${ipv6_gw_addr}
1014    ...          ${valid_status_codes}=[${HTTP_OK},${HTTP_ACCEPTED},${HTTP_NO_CONTENT}]
1015
1016    # Description of argument(s):
1017    # ipv6_gw_addr          IPv6 Static Default Gateway address to be deleted.
1018    # valid_status_codes    Expected return code from patch operation
1019    #                       (e.g. "200").
1020
1021    ${patch_list}=  Create List
1022    ${empty_dict}=  Create Dictionary
1023
1024    ${ipv6_static_def_gw_list}=  Create List
1025    @{ipv6_static_defgw_configurations}=  Get IPv6 Static Default Gateway
1026
1027    FOR  ${ipv6_staticdef_gateway}  IN  @{ipv6_static_defgw_configurations}
1028        ${value}=  Get From Dictionary  ${ipv6_staticdef_gateway}  Address
1029        Append To List  ${ipv6_static_def_gw_list}  ${value}
1030    END
1031
1032    ${defgw_found}=  Run Keyword And Return Status  List Should Contain Value
1033    ...  ${ipv6_static_def_gw_list}  ${ipv6_gw_addr}  msg=${ipv6_gw_addr} does not exist on BMC
1034    Skip If  ${defgw_found} == ${False}  ${ipv6_gw_addr} does not exist on BMC
1035
1036    FOR  ${ipv6_static_def_gw}  IN  @{ipv6_static_defgw_configurations}
1037        IF  '${ipv6_static_def_gw['Address']}' == '${ipv6_gw_addr}'
1038            Append To List  ${patch_list}  ${null}
1039        ELSE
1040            Append To List  ${patch_list}  ${empty_dict}
1041      END
1042    END
1043
1044    # Run patch command only if given IP is found on BMC.
1045    ${data}=  Create Dictionary  IPv6StaticDefaultGateways=${patch_list}
1046
1047    Redfish.Patch  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}  body=&{data}
1048    ...  valid_status_codes=${valid_status_codes}
1049
1050    ${data}=  Create Dictionary  IPv6StaticDefaultGateways=${patch_list}
1051
1052    @{ipv6_static_defgw_configurations}=  Get IPv6 Static Default Gateway
1053    Should Not Contain Match  ${ipv6_static_defgw_configurations}  ${ipv6_gw_addr}
1054    ...  msg=IPv6 Static default gateway does not exist.
1055
1056
1057Check Coexistence Of Linklocalv6 And Static IPv6
1058    [Documentation]  Verify both linklocalv6 and static IPv6 exist.
1059
1060    # Verify the address origin contains static and linklocal.
1061    @{ipv6_addressorigin_list}  ${ipv6_linklocal_addr}=  Get Address Origin List And Address For Type  LinkLocal
1062
1063    Should Match Regexp  ${ipv6_linklocal_addr}        ${linklocal_addr_format}
1064    Should Contain       ${ipv6_addressorigin_list}    Static
1065
1066
1067Check Coexistence Of Static IPv6 And SLAAC
1068    [Documentation]  Verify both static IPv6 and SLAAC coexist.
1069
1070    # Verify the address origin contains static and slaac.
1071    @{ipv6_addressorigin_list}  ${ipv6_static_addr}=
1072    ...    Get Address Origin List And Address For Type  Static
1073
1074    @{ipv6_addressorigin_list}  ${ipv6_slaac_addr}=
1075    ...    Get Address Origin List And Address For Type  SLAAC
1076
1077
1078Check Coexistence Of Link Local And SLAAC
1079    [Documentation]  Verify both link local and SLAAC coexist.
1080
1081    # Verify the address origin contains SLAAC and link local.
1082    @{ipv6_addressorigin_list}  ${ipv6_link_local_addr}=
1083    ...    Get Address Origin List And Address For Type  LinkLocal
1084
1085    @{ipv6_addressorigin_list}  ${ipv6_slaac_addr}=
1086    ...    Get Address Origin List And Address For Type  SLAAC
1087
1088    Should Match Regexp    ${ipv6_link_local_addr}    ${linklocal_addr_format}
1089
1090
1091Check Coexistence Of Link Local And DHCPv6
1092    [Documentation]  Verify both link local and dhcpv6 coexist.
1093
1094    # Verify the address origin contains dhcpv6 and link local.
1095    @{ipv6_address_origin_list}  ${ipv6_link_local_addr}=
1096    ...    Get Address Origin List And Address For Type  LinkLocal
1097
1098    @{ipv6_address_origin_list}  ${ipv6_dhcpv6_addr}=
1099    ...    Get Address Origin List And Address For Type  DHCPv6
1100
1101    Should Match Regexp    ${ipv6_link_local_addr}    ${linklocal_addr_format}
1102
1103
1104Check If Linklocal Address Is In Correct Format
1105    [Documentation]  Linklocal address has network part fe80 and host part EUI64.
1106
1107    # Fetch the linklocal address.
1108    @{ipv6_addressorigin_list}  ${ipv6_linklocal_addr}=  Get Address Origin List And Address For Type  LinkLocal
1109
1110    # Follow EUI64 from MAC.
1111    ${system_mac}=  Get BMC MAC Address
1112    ${split_octets}=  Split String  ${system_mac}  :
1113    ${first_octet}=  Evaluate  int('${split_octets[0]}', 16)
1114    ${flipped_hex}=  Evaluate  format(${first_octet} ^ 2, '02x')
1115    ${grp1}=  Evaluate  re.sub(r'^0+', '', '${flipped_hex}${split_octets[1]}')  modules=re
1116    ${grp2}=  Evaluate  re.sub(r'^0+', '', '${split_octets[2]}ff')  modules=re
1117    ${grp3}=  Evaluate  re.sub(r'^0+', '', '${split_octets[4]}${split_octets[5]}')  modules=re
1118    ${linklocal}=  Set Variable  fe80::${grp1}:${grp2}:fe${split_octets[3]}:${grp3}
1119
1120    # Verify the linklocal obtained is the same as on the machine.
1121    Should Be Equal  ${linklocal}  ${ipv6_linklocal_addr}
1122
1123
1124Check BMC Gets SLAAC Address
1125    [Documentation]  Check BMC gets slaac address.
1126
1127    @{ipv6_addressorigin_list}  ${ipv6_slaac_addr}=  Get Address Origin List And Address For Type  SLAAC
1128
1129
1130Get The Initial DHCPv6 Setting On Each Interface
1131    [Documentation]  Get the initial DHCPv6 setting of each interface.
1132    [Arguments]  ${channel_number}
1133
1134    # Description of the argument(s):
1135    # channel_number    Channel number 1 or 2.
1136
1137    ${ethernet_interface}=  Set Variable  ${active_channel_config['${channel_number}']['name']}
1138    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}
1139    ${initial_dhcpv6_iface}=  Get From Dictionary  ${resp.dict}  DHCPv6
1140    IF  ${channel_number}==${1}
1141        Set Test Variable  ${dhcpv6_channel_1}  ${initial_dhcpv6_iface['OperatingMode']}
1142    ELSE
1143        Set Test Variable  ${dhcpv6_channel_2}  ${initial_dhcpv6_iface['OperatingMode']}
1144    END
1145
1146
1147Get The Initial DHCPv6 Settings
1148    [Documentation]  Get the initial DHCPv6 settings of both the interfaces.
1149
1150    Get The Initial DHCPv6 Setting On Each Interface  ${1}
1151    Get The Initial DHCPv6 Setting On Each Interface  ${2}
1152
1153
1154Get The Initial SLAAC Settings
1155    [Documentation]  Get the initial SLAAC settings of both the interfaces.
1156
1157    Get The Initial SLAAC Setting On Each Interface   ${1}
1158    Get The Initial SLAAC Setting On Each Interface   ${2}
1159
1160
1161Get The Initial SLAAC Setting On Each Interface
1162    [Documentation]  Get the initial SLAAC setting of the interface.
1163    [Arguments]  ${channel_number}
1164
1165    # Description of the argument(s):
1166    # channel_number     Channel number 1 or 2.
1167
1168    ${ethernet_interface}=  Set Variable  ${active_channel_config['${channel_number}']['name']}
1169    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH_IFACE}${ethernet_interface}
1170    ${initial_slaac_iface}=  Get From Dictionary  ${resp.dict}  StatelessAddressAutoConfig
1171    IF  ${channel_number}==${1}
1172        Set Test Variable  ${slaac_channel_1}  ${initial_slaac_iface['IPv6AutoConfigEnabled']}
1173    ELSE
1174        Set Test Variable  ${slaac_channel_2}  ${initial_slaac_iface['IPv6AutoConfigEnabled']}
1175    END
1176
1177
1178Get Address Origin List And IPv4 or IPv6 Address
1179    [Documentation]  Get address origin list and address for type.
1180    [Arguments]  ${ip_address_type}  ${channel_number}=${CHANNEL_NUMBER}
1181
1182    # Description of the argument(s):
1183    # ip_address_type  Type of IPv4 or IPv6 address to be checked.
1184    # channel_number   Channel number 1(eth0) or 2(eth1).
1185
1186    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH_IFACE}${active_channel_config['${channel_number}']['name']}
1187    @{ip_addresses}=  Get From Dictionary  ${resp.dict}  ${ip_address_type}
1188
1189    ${ip_addressorigin_list}=  Create List
1190    ${ip_addr_list}=  Create List
1191    FOR  ${ip_address}  IN  @{ip_addresses}
1192        ${ip_addressorigin}=  Get From Dictionary  ${ip_address}  AddressOrigin
1193        Append To List  ${ip_addressorigin_list}  ${ip_addressorigin}
1194        Append To List  ${ip_addr_list}  ${ip_address['Address']}
1195    END
1196    RETURN  ${ip_addressorigin_list}  ${ip_addr_list}
1197
1198
1199Verify All The Addresses Are Intact
1200    [Documentation]  Verify all the addresses and address origins remain intact.
1201    [Arguments]    ${channel_number}=${CHANNEL_NUMBER}
1202    ...  ${initial_ipv4_addressorigin_list}=${initial_ipv4_addressorigin_list}
1203    ...  ${initial_ipv4_addr_list}=${initial_ipv4_addr_list}
1204
1205    # Description of argument(s):
1206    # channel_number                   Channel number 1(eth0) or 2(eth1).
1207    # initial_ipv4_addressorigin_list  Initial IPv4 address origin list.
1208    # initial_ipv4_addr_list           Initial IPv4 address list.
1209
1210    # Verify that it will not impact the IPv4 configuration.
1211    Sleep  ${NETWORK_TIMEOUT}
1212    Wait For Host To Ping  ${OPENBMC_HOST}  ${NETWORK_TIMEOUT}
1213
1214    # IPv6 Linklocal address must be present.
1215    @{ipv6_addressorigin_list}  ${ipv6_linklocal_addr}=
1216    ...  Get Address Origin List And Address For Type  LinkLocal  ${channel_number}
1217
1218    # IPv4 addresses must remain intact.
1219    ${ipv4_addressorigin_list}  ${ipv4_addr_list}=
1220    ...  Get Address Origin List And IPv4 or IPv6 Address  IPv4Addresses  ${channel_number}
1221
1222    Should be Equal  ${initial_ipv4_addressorigin_list}  ${ipv4_addressorigin_list}
1223    Should be Equal  ${initial_ipv4_addr_list}  ${ipv4_addr_list}
1224
1225
1226Get Interface ID Of IPv6
1227    [Documentation]  Get interface id of IPv6 address.
1228    [Arguments]    ${ipv6_address}
1229
1230    # Description of the argument(s):
1231    # ${ipv6_address}  IPv6 Address to extract the last 4 hextets.
1232
1233    # Last 64 bits of SLAAC and Linklocal must be the same.
1234    # Sample IPv6 network configurations.
1235    #"IPv6AddressPolicyTable": [],
1236    #  "IPv6Addresses": [
1237    #    {
1238    #      "Address": "fe80::xxxx:xxxx:xxxx:xxxx",
1239    #      "AddressOrigin": "LinkLocal",
1240    #      "AddressState": null,
1241    #      "PrefixLength": xx
1242    #    }
1243    #  ],
1244    #    {
1245    #      "Address": "2002:xxxx:xxxx:xxxx:xxxx",
1246    #      "AddressOrigin": "SLAAC",
1247    #      "PrefixLength": 64
1248    #    }
1249    #  ],
1250
1251    ${split_ip_address}=  Split String  ${ipv6_address}  :
1252    ${missing_ip}=  Evaluate  8 - len(${split_ip_address}) + 1
1253    ${expanded_ip}=  Create List
1254
1255    FOR  ${hextet}  IN  @{split_ip_address}
1256       IF  '${hextet}' == ''
1257           FOR  ${i}  IN RANGE  ${missing_ip}
1258               Append To List  ${expanded_ip}  0000
1259           END
1260       ELSE
1261           Append To List  ${expanded_ip}  ${hextet}
1262       END
1263    END
1264    ${interface_id}=  Evaluate  ':'.join(${expanded_ip}[-4:])
1265    RETURN  ${interface_id}
1266
1267
1268Set And Verify SLAAC Property On Both Interfaces
1269    [Documentation]  Set and verify SLAAC property on both interfaces.
1270    [Arguments]  ${slaac_value_1}  ${slaac_value_2}
1271
1272    # Description of the argument(s):
1273    # slaac_value_1  SLAAC value for channel 1.
1274    # slaac_value_2  SLAAC value for channel 2.
1275
1276    Set SLAAC Configuration State And Verify  ${slaac_value_1}  [${HTTP_OK}]  ${1}
1277    Set SLAAC Configuration State And Verify  ${slaac_value_2}  [${HTTP_OK}]  ${2}
1278
1279    Sleep  30s
1280
1281    # Check SLAAC Settings for eth0.
1282    @{ipv6_addressorigin_list}  ${ipv6_slaac_addr}=
1283    ...  Get Address Origin List And IPv4 or IPv6 Address  IPv6Addresses  ${1}
1284    IF  "${slaac_value_1}" == "${True}"
1285         Should Not Be Empty  ${ipv6_slaac_addr}  SLAAC
1286    ELSE
1287        Should Not Contain  ${ipv6_addressorigin_list}  SLAAC
1288    END
1289
1290    # Check SLAAC Settings for eth1.
1291    @{ipv6_addressorigin_list}  ${ipv6_slaac_addr}=
1292    ...  Get Address Origin List And IPv4 or IPv6 Address  IPv6Addresses  ${2}
1293    IF  "${slaac_value_2}" == "${True}"
1294         Should Not Be Empty  ${ipv6_slaac_addr}  SLAAC
1295    ELSE
1296        Should Not Contain  ${ipv6_addressorigin_list}  SLAAC
1297    END
1298
1299    Verify All The Addresses Are Intact  ${1}
1300    Verify All The Addresses Are Intact  ${2}
1301    ...    ${eth1_initial_ipv4_addressorigin_list}  ${eth1_initial_ipv4_addr_list}
1302
1303