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