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 299*** Keywords *** 300 301Suite Setup Execution 302 [Documentation] Do suite setup execution. 303 304 Redfish.Login 305 ${active_channel_config}= Get Active Channel Config 306 Set Suite Variable ${active_channel_config} 307 308 ${ethernet_interface}= Set Variable ${active_channel_config['${CHANNEL_NUMBER}']['name']} 309 310 Set Suite variable ${ethernet_interface} 311 312 ${initial_ipv4_addressorigin_list} ${initial_ipv4_addr_list}= Get Address Origin List And IPv4 or IPv6 Address IPv4Addresses 313 ${initial_ipv6_addressorigin_list} ${initial_ipv6_addr_list}= Get Address Origin List And IPv4 or IPv6 Address IPv6Addresses 314 315 Set Suite Variable ${initial_ipv4_addressorigin_list} 316 Set Suite Variable ${initial_ipv4_addr_list} 317 Set Suite Variable ${initial_ipv6_addressorigin_list} 318 Set Suite Variable ${initial_ipv6_addr_list} 319 320 321Test Setup Execution 322 [Documentation] Test setup execution. 323 324 @{ipv6_network_configurations}= Get IPv6 Network Configuration 325 Set Test Variable @{ipv6_network_configurations} 326 327 # Get BMC IPv6 address and prefix length. 328 ${ipv6_data}= Get BMC IPv6 Info 329 Set Test Variable ${ipv6_data} 330 331 332Test Teardown Execution 333 [Documentation] Test teardown execution. 334 335 FFDC On Test Case Fail 336 337 338Get IPv6 Network Configuration 339 [Documentation] Get Ipv6 network configuration. 340 # Sample output: 341 # { 342 # "@odata.id": "/redfish/v1/Managers/${MANAGER_ID}/EthernetInterfaces/eth0", 343 # "@odata.type": "#EthernetInterface.v1_4_1.EthernetInterface", 344 # "DHCPv4": { 345 # "DHCPEnabled": false, 346 # "UseDNSServers": false, 347 # "UseDomainName": true, 348 # "UseNTPServers": false 349 # }, 350 # "DHCPv6": { 351 # "OperatingMode": "Disabled", 352 # "UseDNSServers": false, 353 # "UseDomainName": true, 354 # "UseNTPServers": false 355 # }, 356 # "Description": "Management Network Interface", 357 # "FQDN": "localhost", 358 # "HostName": "localhost", 359 # "IPv4Addresses": [ 360 # { 361 # "Address": "xx.xx.xx.xx", 362 # "AddressOrigin": "Static", 363 # "Gateway": "xx.xx.xx.1", 364 # "SubnetMask": "xx.xx.xx.0" 365 # }, 366 # { 367 # "Address": "169.254.xx.xx", 368 # "AddressOrigin": "IPv4LinkLocal", 369 # "Gateway": "0.0.0.0", 370 # "SubnetMask": "xx.xx.0.0" 371 # }, 372 # ], 373 # "IPv4StaticAddresses": [ 374 # { 375 # "Address": "xx.xx.xx.xx", 376 # "AddressOrigin": "Static", 377 # "Gateway": "xx.xx.xx.1", 378 # "SubnetMask": "xx.xx.0.0" 379 # } 380 # } 381 # ], 382 # "IPv6AddressPolicyTable": [], 383 # "IPv6Addresses": [ 384 # { 385 # "Address": "fe80::xxxx:xxxx:xxxx:xxxx", 386 # "AddressOrigin": "LinkLocal", 387 # "AddressState": null, 388 # "PrefixLength": xx 389 # } 390 # ], 391 # "IPv6DefaultGateway": "", 392 # "IPv6StaticAddresses": [ 393 # { "Address": "xxxx:xxxx:xxxx:xxxx::xxxx", 394 # "AddressOrigin": "Static", 395 # "AddressState": null, 396 # "PrefixLength": xxx 397 # } 398 # ], 399 # "Id": "eth0", 400 # "InterfaceEnabled": true, 401 # "LinkStatus": "LinkUp", 402 # "MACAddress": "xx:xx:xx:xx:xx:xx", 403 # "Name": "Manager Ethernet Interface", 404 # "NameServers": [], 405 # "SpeedMbps": 0, 406 # "StaticNameServers": [], 407 # "Status": { 408 # "Health": "OK", 409 # "HealthRollup": "OK", 410 # "State": "Enabled" 411 # }, 412 # "VLANs": { 413 # "@odata.id": "/redfish/v1/Managers/${MANAGER_ID}/EthernetInterfaces/eth0/VLANs" 414 415 416 ${active_channel_config}= Get Active Channel Config 417 ${resp}= Redfish.Get ${REDFISH_NW_ETH_IFACE}${active_channel_config['${CHANNEL_NUMBER}']['name']} 418 419 @{ipv6_network_configurations}= Get From Dictionary ${resp.dict} IPv6StaticAddresses 420 RETURN @{ipv6_network_configurations} 421 422 423Verify IPv6 And PrefixLength 424 [Documentation] Verify IPv6 address and prefix length on BMC. 425 [Arguments] ${ipv6_addr} ${prefix_len} 426 427 # Description of the argument(s): 428 # ipv6_addr IPv6 address to be verified. 429 # prefix_len PrefixLength value to be verified. 430 431 # Catenate IPv6 address and its prefix length. 432 ${ipv6_with_prefix}= Catenate ${ipv6_addr}/${prefix_len} 433 434 # Get IPv6 address details on BMC using IP command. 435 @{ip_data}= Get BMC IPv6 Info 436 437 # Verify if IPv6 and prefix length is configured on BMC. 438 439 Should Contain ${ip_data} ${ipv6_with_prefix} 440 ... msg=IPv6 and prefix length pair does not exist. 441 442 443Configure IPv6 Address On BMC 444 [Documentation] Add IPv6 Address on BMC. 445 [Arguments] ${ipv6_addr} ${prefix_len} ${valid_status_codes}=${HTTP_OK} 446 447 # Description of argument(s): 448 # ipv6_addr IPv6 address to be added (e.g. "2001:EEEE:2222::2022"). 449 # prefix_len Prefix length for the IPv6 to be added 450 # (e.g. "64"). 451 # valid_status_codes Expected return code from patch operation 452 # (e.g. "200"). 453 454 ${prefix_length}= Convert To Integer ${prefix_len} 455 ${empty_dict}= Create Dictionary 456 ${ipv6_data}= Create Dictionary Address=${ipv6_addr} 457 ... PrefixLength=${prefix_length} 458 459 ${patch_list}= Create List 460 461 # Get existing static IPv6 configurations on BMC. 462 ${ipv6_network_configurations}= Get IPv6 Network Configuration 463 ${num_entries}= Get Length ${ipv6_network_configurations} 464 465 FOR ${INDEX} IN RANGE 0 ${num_entries} 466 Append To List ${patch_list} ${empty_dict} 467 END 468 469 ${valid_status_codes}= Set Variable If '${valid_status_codes}' == '${HTTP_OK}' 470 ... ${HTTP_OK},${HTTP_NO_CONTENT} 471 ... ${valid_status_codes} 472 473 # We need not check for existence of IPv6 on BMC while adding. 474 Append To List ${patch_list} ${ipv6_data} 475 ${data}= Create Dictionary IPv6StaticAddresses=${patch_list} 476 477 ${active_channel_config}= Get Active Channel Config 478 ${ethernet_interface}= Set Variable ${active_channel_config['${CHANNEL_NUMBER}']['name']} 479 480 Redfish.patch ${REDFISH_NW_ETH_IFACE}${ethernet_interface} body=&{data} 481 ... valid_status_codes=[${valid_status_codes}] 482 483 Return From Keyword If '${valid_status_codes}' != '${HTTP_OK},${HTTP_NO_CONTENT}' 484 485 # Note: Network restart takes around 15-18s after patch request processing. 486 Sleep ${NETWORK_TIMEOUT}s 487 Wait For Host To Ping ${OPENBMC_HOST} ${NETWORK_TIMEOUT} 488 489 Verify IPv6 And PrefixLength ${ipv6_addr} ${prefix_len} 490 491 # Verify if existing static IPv6 addresses still exist. 492 FOR ${ipv6_network_configuration} IN @{ipv6_network_configurations} 493 Verify IPv6 On BMC ${ipv6_network_configuration['Address']} 494 END 495 496 Validate IPv6 Network Config On BMC 497 498 499Validate IPv6 Network Config On BMC 500 [Documentation] Check that IPv6 network info obtained via redfish matches info 501 ... obtained via CLI. 502 503 @{ipv6_network_configurations}= Get IPv6 Network Configuration 504 ${ipv6_data}= Get BMC IPv6 Info 505 FOR ${ipv6_network_configuration} IN @{ipv6_network_configurations} 506 Should Contain Match ${ipv6_data} ${ipv6_network_configuration['Address']}/* 507 ... msg=IPv6 address does not exist. 508 END 509 510 511Delete IPv6 Address 512 [Documentation] Delete IPv6 address of BMC. 513 [Arguments] ${ipv6_addr} 514 ... ${valid_status_codes}=[${HTTP_OK},${HTTP_ACCEPTED},${HTTP_NO_CONTENT}] 515 516 # Description of argument(s): 517 # ipv6_addr IPv6 address to be deleted (e.g. "2001:1234:1234:1234::1234"). 518 # valid_status_codes Expected return code from patch operation 519 # (e.g. "200"). See prolog of rest_request 520 # method in redfish_plus.py for details. 521 522 ${empty_dict}= Create Dictionary 523 ${patch_list}= Create List 524 525 @{ipv6_network_configurations}= Get IPv6 Network Configuration 526 FOR ${ipv6_network_configuration} IN @{ipv6_network_configurations} 527 IF '${ipv6_network_configuration['Address']}' == '${ipv6_addr}' 528 Append To List ${patch_list} ${null} 529 ELSE 530 Append To List ${patch_list} ${empty_dict} 531 END 532 END 533 534 ${ip_found}= Run Keyword And Return Status List Should Contain Value 535 ... ${patch_list} ${null} msg=${ipv6_addr} does not exist on BMC 536 Pass Execution If ${ip_found} == ${False} ${ipv6_addr} does not exist on BMC 537 538 # Run patch command only if given IP is found on BMC 539 ${data}= Create Dictionary IPv6StaticAddresses=${patch_list} 540 541 ${active_channel_config}= Get Active Channel Config 542 ${ethernet_interface}= Set Variable ${active_channel_config['${CHANNEL_NUMBER}']['name']} 543 544 Redfish.patch ${REDFISH_NW_ETH_IFACE}${ethernet_interface} body=&{data} 545 ... valid_status_codes=${valid_status_codes} 546 547 # Note: Network restart takes around 15-18s after patch request processing 548 Sleep ${NETWORK_TIMEOUT}s 549 Wait For Host To Ping ${OPENBMC_HOST} ${NETWORK_TIMEOUT} 550 551 # IPv6 address that is deleted should not be there on BMC. 552 ${delete_status}= Run Keyword And Return Status Verify IPv6 On BMC ${ipv6_addr} 553 IF '${valid_status_codes}' == '[${HTTP_OK},${HTTP_ACCEPTED},${HTTP_NO_CONTENT}]' 554 Should Be True '${delete_status}' == '${False}' 555 ELSE 556 Should Be True '${delete_status}' == '${True}' 557 END 558 559 Validate IPv6 Network Config On BMC 560 561 562Modify IPv6 Address 563 [Documentation] Modify and verify IPv6 address of BMC. 564 [Arguments] ${ipv6} ${new_ipv6} ${prefix_len} 565 ... ${valid_status_codes}=[${HTTP_OK}, ${HTTP_NO_CONTENT}] 566 567 # Description of argument(s): 568 # ipv6 IPv6 address to be replaced (e.g. "2001:AABB:CCDD::AAFF"). 569 # new_ipv6 New IPv6 address to be configured. 570 # prefix_len Prefix length value (Range 1 to 128). 571 # valid_status_codes Expected return code from patch operation 572 # (e.g. "200", "201"). 573 574 ${empty_dict}= Create Dictionary 575 ${patch_list}= Create List 576 ${prefix_length}= Convert To Integer ${prefix_len} 577 ${ipv6_data}= Create Dictionary 578 ... Address=${new_ipv6} PrefixLength=${prefix_length} 579 580 # Sample IPv6 network configurations: 581 # "IPv6AddressPolicyTable": [], 582 # "IPv6Addresses": [ 583 # { 584 # "Address": "X002:db8:0:2::XX0", 585 # "AddressOrigin": "DHCPv6", 586 # "PrefixLength": 128 587 # }, 588 # { 589 # "Address": “X002:db8:0:2:a94:XXff:fe82:XXXX", 590 # "AddressOrigin": "SLAAC", 591 # "PrefixLength": 64 592 # }, 593 # { 594 # "Address": “Y002:db8:0:2:a94:efff:fe82:5000", 595 # "AddressOrigin": "Static", 596 # "PrefixLength": 56 597 # }, 598 # { 599 # "Address": “Z002:db8:0:2:a94:efff:fe82:5000", 600 # "AddressOrigin": "Static", 601 # "PrefixLength": 56 602 # }, 603 # { 604 # "Address": “Xe80::a94:efff:YYYY:XXXX", 605 # "AddressOrigin": "LinkLocal", 606 # "PrefixLength": 64 607 # }, 608 # { 609 # "Address": “X002:db8:1:2:eff:233:fee:546", 610 # "AddressOrigin": "Static", 611 # "PrefixLength": 56 612 # } 613 # ], 614 # "IPv6DefaultGateway": “XXXX::ab2e:80fe:87df:XXXX”, 615 # "IPv6StaticAddresses": [ 616 # { 617 # "Address": “X002:db8:0:2:a94:efff:fe82:5000", 618 # "PrefixLength": 56 619 # }, 620 # { 621 # "Address": “Y002:db8:0:2:a94:efff:fe82:5000", 622 # "PrefixLength": 56 623 # }, 624 # { 625 # "Address": “Z002:db8:1:2:eff:233:fee:546", 626 # "PrefixLength": 56 627 # } 628 # ], 629 # "IPv6StaticDefaultGateways": [], 630 631 # Find the position of IPv6 address to be modified. 632 @{ipv6_network_configurations}= Get IPv6 Network Configuration 633 FOR ${ipv6_network_configuration} IN @{ipv6_network_configurations} 634 IF '${ipv6_network_configuration['Address']}' == '${ipv6}' 635 Append To List ${patch_list} ${ipv6_data} 636 ELSE 637 Append To List ${patch_list} ${empty_dict} 638 END 639 END 640 641 # Modify the IPv6 address only if given IPv6 is found 642 ${ip_found}= Run Keyword And Return Status List Should Contain Value 643 ... ${patch_list} ${ipv6_data} msg=${ipv6} does not exist on BMC 644 Pass Execution If ${ip_found} == ${False} ${ipv6} does not exist on BMC 645 646 ${data}= Create Dictionary IPv6StaticAddresses=${patch_list} 647 648 ${active_channel_config}= Get Active Channel Config 649 ${ethernet_interface}= Set Variable ${active_channel_config['${CHANNEL_NUMBER}']['name']} 650 651 Redfish.patch ${REDFISH_NW_ETH_IFACE}${ethernet_interface} 652 ... body=&{data} valid_status_codes=${valid_status_codes} 653 654 # Note: Network restart takes around 15-18s after patch request processing. 655 Sleep ${NETWORK_TIMEOUT}s 656 Wait For Host To Ping ${OPENBMC_HOST} ${NETWORK_TIMEOUT} 657 658 # Verify if new IPv6 address is configured on BMC. 659 Verify IPv6 On BMC ${new_ipv6} 660 661 # Verify if old IPv6 address is erased. 662 ${cmd_status}= Run Keyword And Return Status 663 ... Verify IPv6 On BMC ${ipv6} 664 Should Be Equal ${cmd_status} ${False} msg=Old IPv6 address is not deleted. 665 666 Validate IPv6 Network Config On BMC 667 668 669Set SLAAC Configuration State And Verify 670 [Documentation] Set SLAAC configuration state and verify. 671 [Arguments] ${slaac_state} ${valid_status_codes}=[${HTTP_OK},${HTTP_ACCEPTED},${HTTP_NO_CONTENT}] 672 ... ${channel_number}=${CHANNEL_NUMBER} 673 674 # Description of argument(s): 675 # slaac_state SLAAC state('True' or 'False'). 676 # valid_status_code Expected valid status codes. 677 # channel_number Channel number 1(eth0) or 2(eth1). 678 679 ${active_channel_config}= Get Active Channel Config 680 ${ethernet_interface}= Set Variable ${active_channel_config['${CHANNEL_NUMBER}']['name']} 681 682 ${data}= Set Variable If ${slaac_state} == ${False} ${DISABLE_SLAAC} ${ENABLE_SLAAC} 683 ${resp}= Redfish.Patch ${REDFISH_NW_ETH_IFACE}${ethernet_interface} 684 ... body=${data} valid_status_codes=${valid_status_codes} 685 686 # Verify SLAAC is set correctly. 687 ${resp}= Redfish.Get ${REDFISH_NW_ETH_IFACE}${ethernet_interface} 688 ${slaac_verify}= Get From Dictionary ${resp.dict} StatelessAddressAutoConfig 689 690 IF '${slaac_verify['IPv6AutoConfigEnabled']}' != '${slaac_state}' 691 Fail msg=SLAAC not set properly. 692 END 693 694Set And Verify DHCPv6 Property 695 [Documentation] Set DHCPv6 property and verify. 696 [Arguments] ${dhcpv6_operating_mode}=${Disabled} ${channel_number}=${CHANNEL_NUMBER} 697 698 # Description of argument(s): 699 # dhcpv6_operating_mode Enabled if user wants to enable DHCPv6('Enabled' or 'Disabled'). 700 # channel_number Channel number 1 or 2. 701 702 Set DHCPv6 Property ${dhcpv6_operating_mode} ${channel_number} 703 Verify DHCPv6 Property ${dhcpv6_operating_mode} ${channel_number} 704 705 706Set DHCPv6 Property 707 [Documentation] Set DHCPv6 attribute is enables or disabled. 708 [Arguments] ${dhcpv6_operating_mode}=${Disabled} ${channel_number}=${CHANNEL_NUMBER} 709 710 # Description of argument(s): 711 # dhcpv6_operating_mode Enabled if user wants to enable DHCPv6('Enabled' or 'Disabled'). 712 # channel_number Channel number 1 or 2. 713 714 ${data}= Set Variable If '${dhcpv6_operating_mode}' == 'Disabled' ${DISABLE_DHCPv6} ${ENABLE_DHCPv6} 715 ${ethernet_interface}= Set Variable ${active_channel_config['${CHANNEL_NUMBER}']['name']} 716 717 Redfish.Patch ${REDFISH_NW_ETH_IFACE}${ethernet_interface} 718 ... body=${data} valid_status_codes=[${HTTP_OK},${HTTP_NO_CONTENT}] 719 720 721Verify DHCPv6 Property 722 [Documentation] Verify DHCPv6 settings is enabled or disabled. 723 [Arguments] ${dhcpv6_operating_mode} ${channel_number}=${CHANNEL_NUMBER} 724 725 # Description of Argument(s): 726 # dhcpv6_operating_mode Enable/ Disable DHCPv6. 727 # channel_number Channel number 1 or 2. 728 729 ${ethernet_interface}= Set Variable ${active_channel_config['${CHANNEL_NUMBER}']['name']} 730 731 ${resp}= Redfish.Get ${REDFISH_NW_ETH_IFACE}${ethernet_interface} 732 ${dhcpv6_verify}= Get From Dictionary ${resp.dict} DHCPv6 733 734 Should Be Equal '${dhcpv6_verify['OperatingMode']}' '${dhcpv6_operating_mode}' 735 736 737Get IPv6 Static Default Gateway 738 [Documentation] Get IPv6 static default gateway. 739 740 ${active_channel_config}= Get Active Channel Config 741 ${resp}= Redfish.Get ${REDFISH_NW_ETH_IFACE}${active_channel_config['${CHANNEL_NUMBER}']['name']} 742 743 @{ipv6_static_defgw_configurations}= Get From Dictionary ${resp.dict} IPv6StaticDefaultGateways 744 RETURN @{ipv6_static_defgw_configurations} 745 746 747Configure IPv6 Static Default Gateway On BMC 748 [Documentation] Configure IPv6 static default gateway on BMC. 749 [Arguments] ${ipv6_gw_addr} ${prefix_length_def} 750 ... ${valid_status_codes}=${HTTP_OK} 751 752 # Description of argument(s): 753 # ipv6_gw_addr IPv6 Static Default Gateway address to be configured. 754 # prefix_len_def Prefix length value (Range 1 to 128). 755 # valid_status_codes Expected return code from patch operation 756 # (e.g. "200", "204".) 757 758 # Prefix Length is passed as None. 759 IF '${prefix_length_def}' == '${None}' 760 ${ipv6_gw}= Create Dictionary Address=${ipv6_gw_addr} 761 ELSE 762 ${ipv6_gw}= Create Dictionary Address=${ipv6_gw_addr} Prefix Length=${prefix_length_def} 763 END 764 765 ${ipv6_static_def_gw}= Get IPv6 Static Default Gateway 766 767 ${num_entries}= Get Length ${ipv6_static_def_gw} 768 769 ${patch_list}= Create List 770 ${empty_dict}= Create Dictionary 771 772 FOR ${INDEX} IN RANGE 0 ${num_entries} 773 Append To List ${patch_list} ${empty_dict} 774 END 775 776 ${valid_status_codes}= Set Variable If '${valid_status_codes}' == '${HTTP_OK}' 777 ... ${HTTP_OK},${HTTP_NO_CONTENT} 778 ... ${valid_status_codes} 779 780 Append To List ${patch_list} ${ipv6_gw} 781 ${data}= Create Dictionary IPv6StaticDefaultGateways=${patch_list} 782 783 Redfish.Patch ${REDFISH_NW_ETH_IFACE}${ethernet_interface} 784 ... body=${data} valid_status_codes=[${valid_status_codes}] 785 786 # Verify the added static default gateway is present in Redfish Get Output. 787 ${ipv6_staticdef_gateway}= Get IPv6 Static Default Gateway 788 789 ${ipv6_static_def_gw_list}= Create List 790 FOR ${ipv6_staticdef_gateway} IN @{ipv6_staticdef_gateway} 791 ${value}= Get From Dictionary ${ipv6_staticdef_gateway} Address 792 Append To List ${ipv6_static_def_gw_list} ${value} 793 END 794 795 IF '${valid_status_codes}' != '${HTTP_OK},${HTTP_NO_CONTENT}' 796 Should Not Contain ${ipv6_static_def_gw_list} ${ipv6_gw_addr} 797 ELSE 798 Should Contain ${ipv6_static_def_gw_list} ${ipv6_gw_addr} 799 END 800 801 802Modify IPv6 Static Default Gateway On BMC 803 [Documentation] Modify and verify IPv6 address of BMC. 804 [Arguments] ${ipv6_gw_addr} ${new_static_def_gw} ${prefix_length} 805 ... ${valid_status_codes}=[${HTTP_OK},${HTTP_ACCEPTED}] 806 807 # Description of argument(s): 808 # ipv6_gw_addr IPv6 static default gateway address to be replaced (e.g. "2001:AABB:CCDD::AAFF"). 809 # new_static_def_gw New static default gateway address to be configured. 810 # prefix_length Prefix length value (Range 1 to 128). 811 # valid_status_codes Expected return code from patch operation 812 # (e.g. "200", "204"). 813 814 ${empty_dict}= Create Dictionary 815 ${patch_list}= Create List 816 # Prefix Length is passed as None. 817 IF '${prefix_length_def}' == '${None}' 818 ${modified_ipv6_gw_addripv6_data}= Create Dictionary Address=${new_static_def_gw} 819 ELSE 820 ${modified_ipv6_gw_addripv6_data}= Create Dictionary Address=${new_static_def_gw} Prefix Length=${prefix_length_def} 821 END 822 823 @{ipv6_static_def_gw_list}= Get IPv6 Static Default Gateway 824 825 FOR ${ipv6_static_def_gw} IN @{ipv6_static_def_gw_list} 826 IF '${ipv6_static_def_gw['Address']}' == '${ipv6_gw_addr}' 827 Append To List ${patch_list} ${modified_ipv6_gw_addripv6_data} 828 ELSE 829 Append To List ${patch_list} ${empty_dict} 830 END 831 END 832 833 # Modify the IPv6 address only if given IPv6 static default gateway is found. 834 ${ip_static_def_gw_found}= Run Keyword And Return Status List Should Contain Value 835 ... ${patch_list} ${modified_ipv6_gw_addripv6_data} msg=${ipv6_gw_addr} does not exist on BMC 836 Pass Execution If ${ip_static_def_gw_found} == ${False} ${ipv6_gw_addr} does not exist on BMC 837 838 ${data}= Create Dictionary IPv6StaticDefaultGateways=${patch_list} 839 840 Redfish.Patch ${REDFISH_NW_ETH_IFACE}${ethernet_interface} 841 ... body=&{data} valid_status_codes=${valid_status_codes} 842 843 ${ipv6_staticdef_gateway}= Get IPv6 Static Default Gateway 844 845 ${ipv6_static_def_gw_list}= Create List 846 FOR ${ipv6_staticdef_gateway} IN @{ipv6_staticdef_gateway} 847 ${value}= Get From Dictionary ${ipv6_staticdef_gateway} Address 848 Append To List ${ipv6_static_def_gw_list} ${value} 849 END 850 851 Should Contain ${ipv6_static_def_gw_list} ${new_static_def_gw} 852 # Verify if old static default gateway address is erased. 853 Should Not Contain ${ipv6_static_def_gw_list} ${ipv6_gw_addr} 854 855 856Delete IPv6 Static Default Gateway 857 [Documentation] Delete IPv6 static default gateway on BMC. 858 [Arguments] ${ipv6_gw_addr} 859 ... ${valid_status_codes}=[${HTTP_OK},${HTTP_ACCEPTED},${HTTP_NO_CONTENT}] 860 861 # Description of argument(s): 862 # ipv6_gw_addr IPv6 Static Default Gateway address to be deleted. 863 # valid_status_codes Expected return code from patch operation 864 # (e.g. "200"). 865 866 ${patch_list}= Create List 867 ${empty_dict}= Create Dictionary 868 869 ${ipv6_static_def_gw_list}= Create List 870 @{ipv6_static_defgw_configurations}= Get IPv6 Static Default Gateway 871 872 FOR ${ipv6_staticdef_gateway} IN @{ipv6_static_defgw_configurations} 873 ${value}= Get From Dictionary ${ipv6_staticdef_gateway} Address 874 Append To List ${ipv6_static_def_gw_list} ${value} 875 END 876 877 ${defgw_found}= Run Keyword And Return Status List Should Contain Value 878 ... ${ipv6_static_def_gw_list} ${ipv6_gw_addr} msg=${ipv6_gw_addr} does not exist on BMC 879 Skip If ${defgw_found} == ${False} ${ipv6_gw_addr} does not exist on BMC 880 881 FOR ${ipv6_static_def_gw} IN @{ipv6_static_defgw_configurations} 882 IF '${ipv6_static_def_gw['Address']}' == '${ipv6_gw_addr}' 883 Append To List ${patch_list} ${null} 884 ELSE 885 Append To List ${patch_list} ${empty_dict} 886 END 887 END 888 889 # Run patch command only if given IP is found on BMC. 890 ${data}= Create Dictionary IPv6StaticDefaultGateways=${patch_list} 891 892 Redfish.Patch ${REDFISH_NW_ETH_IFACE}${ethernet_interface} body=&{data} 893 ... valid_status_codes=${valid_status_codes} 894 895 ${data}= Create Dictionary IPv6StaticDefaultGateways=${patch_list} 896 897 @{ipv6_static_defgw_configurations}= Get IPv6 Static Default Gateway 898 Should Not Contain Match ${ipv6_static_defgw_configurations} ${ipv6_gw_addr} 899 ... msg=IPv6 Static default gateway does not exist. 900 901 902Check Coexistence Of Linklocalv6 And Static IPv6 903 [Documentation] Verify both linklocalv6 and static IPv6 exist. 904 905 # Verify the address origin contains static and linklocal. 906 @{ipv6_addressorigin_list} ${ipv6_linklocal_addr}= Get Address Origin List And Address For Type LinkLocal 907 908 Should Match Regexp ${ipv6_linklocal_addr} ${linklocal_addr_format} 909 Should Contain ${ipv6_addressorigin_list} Static 910 911 912Check If Linklocal Address Is In Correct Format 913 [Documentation] Linklocal address has network part fe80 and host part EUI64. 914 915 # Fetch the linklocal address. 916 @{ipv6_addressorigin_list} ${ipv6_linklocal_addr}= Get Address Origin List And Address For Type LinkLocal 917 918 # Follow EUI64 from MAC. 919 ${system_mac}= Get BMC MAC Address 920 ${split_octets}= Split String ${system_mac} : 921 ${first_octet}= Evaluate int('${split_octets[0]}', 16) 922 ${flipped_hex}= Evaluate format(${first_octet} ^ 2, '02x') 923 ${grp1}= Evaluate re.sub(r'^0+', '', '${flipped_hex}${split_octets[1]}') modules=re 924 ${grp2}= Evaluate re.sub(r'^0+', '', '${split_octets[2]}ff') modules=re 925 ${grp3}= Evaluate re.sub(r'^0+', '', '${split_octets[4]}${split_octets[5]}') modules=re 926 ${linklocal}= Set Variable fe80::${grp1}:${grp2}:fe${split_octets[3]}:${grp3} 927 928 # Verify the linklocal obtained is the same as on the machine. 929 Should Be Equal ${linklocal} ${ipv6_linklocal_addr} 930 931 932Check BMC Gets SLAAC Address 933 [Documentation] Check BMC gets slaac address. 934 935 @{ipv6_addressorigin_list} ${ipv6_slaac_addr}= Get Address Origin List And Address For Type SLAAC 936 937 938Get The Initial DHCPv6 Setting On Each Interface 939 [Documentation] Get the initial DHCPv6 setting of each interface. 940 [Arguments] ${channel_number} 941 942 # Description of the argument(s): 943 # channel_number Channel number 1 or 2. 944 945 ${ethernet_interface}= Set Variable ${active_channel_config['${channel_number}']['name']} 946 ${resp}= Redfish.Get ${REDFISH_NW_ETH_IFACE}${ethernet_interface} 947 ${initial_dhcpv6_iface}= Get From Dictionary ${resp.dict} DHCPv6 948 IF ${channel_number}==${1} 949 Set Test Variable ${dhcpv6_channel_1} ${initial_dhcpv6_iface['OperatingMode']} 950 ELSE 951 Set Test Variable ${dhcpv6_channel_2} ${initial_dhcpv6_iface['OperatingMode']} 952 END 953 954 955Get The Initial DHCPv6 Settings 956 [Documentation] Get the initial DHCPv6 settings of both the interfaces. 957 958 Get The Initial DHCPv6 Setting On Each Interface ${1} 959 Get The Initial DHCPv6 Setting On Each Interface ${2} 960 961 962Get The Initial SLAAC Settings 963 [Documentation] Get the initial SLAAC settings of both the interfaces. 964 965 Get The Initial SLAAC Setting On Each Interface ${1} 966 Get The Initial SLAAC Setting On Each Interface ${2} 967 968 969Get The Initial SLAAC Setting On Each Interface 970 [Documentation] Get the initial SLAAC setting of the interface. 971 [Arguments] ${channel_number} 972 973 # Description of the argument(s): 974 # channel_number Channel number 1 or 2. 975 976 ${ethernet_interface}= Set Variable ${active_channel_config['${channel_number}']['name']} 977 ${resp}= Redfish.Get ${REDFISH_NW_ETH_IFACE}${ethernet_interface} 978 ${initial_slaac_iface}= Get From Dictionary ${resp.dict} StatelessAddressAutoConfig 979 IF ${channel_number}==${1} 980 Set Test Variable ${slaac_channel_1} ${initial_slaac_iface['IPv6AutoConfigEnabled']} 981 ELSE 982 Set Test Variable ${slaac_channel_2} ${initial_slaac_iface['IPv6AutoConfigEnabled']} 983 END 984 985 986Get Address Origin List And Address For Type 987 [Documentation] Get address origin list and address for type. 988 [Arguments] ${ipv6_address_type} 989 990 # Description of the argument(s): 991 # ipv6_address_type Type of IPv6 address to be checked. 992 993 ${resp}= Redfish.Get ${REDFISH_NW_ETH_IFACE}${active_channel_config['${CHANNEL_NUMBER}']['name']} 994 @{ipv6_addresses}= Get From Dictionary ${resp.dict} IPv6Addresses 995 996 ${ipv6_addressorigin_list}= Create List 997 ${ipv6_slaac_addr}= Set Variable ${None} 998 FOR ${ipv6_address} IN @{ipv6_addresses} 999 ${ipv6_addressorigin}= Get From Dictionary ${ipv6_address} AddressOrigin 1000 Append To List ${ipv6_addressorigin_list} ${ipv6_addressorigin} 1001 IF '${ipv6_addressorigin}' == '${ipv6_address_type}' 1002 Set Test Variable ${ipv6_type_addr} ${ipv6_address['Address']} 1003 END 1004 END 1005 Should Contain ${ipv6_addressorigin_list} ${ipv6_address_type} 1006 Should Not Be Empty ${ipv6_type_addr} msg=${ipv6_address_type} address is not present 1007 RETURN @{ipv6_addressorigin_list} ${ipv6_type_addr} 1008 1009 1010Get Address Origin List And IPv4 or IPv6 Address 1011 [Documentation] Get address origin list and address for type. 1012 [Arguments] ${ip_address_type} 1013 1014 # Description of the argument(s): 1015 # ip_address_type Type of IPv4 or IPv6 address to be checked. 1016 1017 ${resp}= Redfish.Get ${REDFISH_NW_ETH_IFACE}${active_channel_config['${CHANNEL_NUMBER}']['name']} 1018 @{ip_addresses}= Get From Dictionary ${resp.dict} ${ip_address_type} 1019 1020 ${ip_addressorigin_list}= Create List 1021 ${ip_addr_list}= Create List 1022 FOR ${ip_address} IN @{ip_addresses} 1023 ${ip_addressorigin}= Get From Dictionary ${ip_address} AddressOrigin 1024 Append To List ${ip_addressorigin_list} ${ip_addressorigin} 1025 Append To List ${ip_addr_list} ${ip_address['Address']} 1026 END 1027 RETURN ${ip_addressorigin_list} ${ip_addr_list} 1028 1029 1030Verify All The Addresses Are Intact 1031 [Documentation] Verify all the addresses and address origins remain intact. 1032 1033 # Verify that it will not impact the IPv4 configuration. 1034 Sleep ${NETWORK_TIMEOUT} 1035 Wait For Host To Ping ${OPENBMC_HOST} ${NETWORK_TIMEOUT} 1036 1037 # IPv6 address must be present. 1038 @{ipv6_addressorigin_list} ${ipv6_slaac_addr}= Get Address Origin List And Address For Type SLAAC 1039 @{ipv6_addressorigin_list} ${ipv6_linklocal_addr}= Get Address Origin List And Address For Type LinkLocal 1040 1041 # IPv4 and IPv6 addresses must remain intact. 1042 ${ipv4_addressorigin_list} ${ipv4_addr_list}= Get Address Origin List And IPv4 or IPv6 Address IPv4Addresses 1043 ${ipv6_addressorigin_list} ${ipv6_addr_list}= Get Address Origin List And IPv4 or IPv6 Address IPv6Addresses 1044 1045 ${ipv6_is_subset}= Evaluate set(${initial_ipv6_addr_list}).issubset(set(${ipv6_addr_list})) 1046 Should Be True ${ipv6_is_subset} 1047 1048 Should be Equal ${initial_ipv4_addressorigin_list} ${ipv4_addressorigin_list} 1049 Should be Equal ${initial_ipv4_addr_list} ${ipv4_addr_list} 1050 1051 1052Get Interface ID Of IPv6 1053 [Documentation] Get interface id of IPv6 address. 1054 [Arguments] ${ipv6_address} 1055 1056 # Description of the argument(s): 1057 # ${ipv6_address} IPv6 Address to extract the last 4 hextets. 1058 1059 # Last 64 bits of SLAAC and Linklocal must be the same. 1060 # Sample IPv6 network configurations. 1061 #"IPv6AddressPolicyTable": [], 1062 # "IPv6Addresses": [ 1063 # { 1064 # "Address": "fe80::xxxx:xxxx:xxxx:xxxx", 1065 # "AddressOrigin": "LinkLocal", 1066 # "AddressState": null, 1067 # "PrefixLength": xx 1068 # } 1069 # ], 1070 # { 1071 # "Address": "2002:xxxx:xxxx:xxxx:xxxx", 1072 # "AddressOrigin": "SLAAC", 1073 # "PrefixLength": 64 1074 # } 1075 # ], 1076 1077 ${split_ip_address}= Split String ${ipv6_address} : 1078 ${missing_ip}= Evaluate 8 - len(${split_ip_address}) + 1 1079 ${expanded_ip}= Create List 1080 1081 FOR ${hextet} IN @{split_ip_address} 1082 IF '${hextet}' == '' 1083 FOR ${i} IN RANGE ${missing_ip} 1084 Append To List ${expanded_ip} 0000 1085 END 1086 ELSE 1087 Append To List ${expanded_ip} ${hextet} 1088 END 1089 END 1090 ${interface_id}= Evaluate ':'.join(${expanded_ip}[-4:]) 1091 RETURN ${interface_id} 1092