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