|  | *** Settings *** | 
|  | Resource                ../lib/utils.robot | 
|  | Resource                ../lib/connection_client.robot | 
|  | Resource                ../lib/boot_utils.robot | 
|  | Library                 ../lib/gen_misc.py | 
|  | Library                 ../lib/utils.py | 
|  | Library                 ../lib/bmc_network_utils.py | 
|  |  | 
|  |  | 
|  | *** Keywords *** | 
|  |  | 
|  | Get BMC IPv6 Info | 
|  | [Documentation]  Get system IPv6 address and prefix length. | 
|  |  | 
|  | # Get system IP address and prefix length details using "ip addr" | 
|  | # Sample Output of "ip addr": | 
|  | # 1: eth0: <BROADCAST,MULTIAST> mtu 1500 qdisc mq state UP qlen 1000 | 
|  | #     link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff | 
|  | #     inet xx.xx.xx.xx/24 brd xx.xx.xx.xx scope global eth0 | 
|  | #     inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link | 
|  | #     inet6 xxxx::xxxx:xxxx:xxxx:xxxx/64 scope global | 
|  |  | 
|  | ${cmd_output}  ${stderr}  ${rc}=  BMC Execute Command  /sbin/ip addr | 
|  |  | 
|  | # Get line having IPv6 address details. | 
|  | ${lines}=  Get Lines Containing String  ${cmd_output}  inet6 | 
|  |  | 
|  | # List IP address details. | 
|  | @{ip_components}=  Split To Lines  ${lines} | 
|  |  | 
|  | @{ipv6_data}=  Create List | 
|  |  | 
|  | # Get all IP addresses and prefix lengths on system. | 
|  | FOR  ${ip_component}  IN  @{ip_components} | 
|  | @{if_info}=  Split String  ${ip_component} | 
|  | ${ip_n_prefix}=  Get From List  ${if_info}  1 | 
|  | Append To List  ${ipv6_data}  ${ip_n_prefix} | 
|  | END | 
|  |  | 
|  | RETURN  ${ipv6_data} | 
|  |  | 
|  |  | 
|  | Verify IPv6 On BMC | 
|  | [Documentation]  Verify IPv6 on BMC. | 
|  | [Arguments]  ${ipv6} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # ipv6  IPv6 address to be verified (e.g. "2001::1234:1234"). | 
|  |  | 
|  | # Get IPv6 address details on BMC using IP command. | 
|  | @{ip_data}=  Get BMC IPv6 Info | 
|  | Should Contain Match  ${ip_data}  ${ipv6}/* | 
|  | ...  msg=IPv6 address does not exist. | 
|  |  | 
|  |  | 
|  | Verify IPv6 Default Gateway On BMC | 
|  | [Documentation]  Verify IPv6 default gateway on BMC. | 
|  | [Arguments]  ${gateway_ip}=0:0:0:0:0:0:0:0 | 
|  |  | 
|  | # Description of argument(s): | 
|  | # gateway_ip  Gateway IPv6 address. | 
|  |  | 
|  | ${route_info}=  Get BMC IPv6 Route Info | 
|  |  | 
|  | # If gateway IP is empty it will not have route entry. | 
|  |  | 
|  | IF  '${gateway_ip}' == '0:0:0:0:0:0:0:0' | 
|  | Pass Execution  Gateway IP is not configured. | 
|  | ELSE | 
|  | Should Contain  ${route_info}  ${gateway_ip}  msg=Gateway IP address not matching. | 
|  | END | 
|  |  | 
|  |  | 
|  | Get BMC IPv6 Route Info | 
|  | [Documentation]  Get IPv6 route info on BMC. | 
|  |  | 
|  | # Sample output of "ip -6 route": | 
|  | # unreachable ::/96 dev lo metric 1024 error -113 | 
|  | # unreachable ::ffff:0.0.0.0/96 dev lo metric 1024 error -113 | 
|  | # 2xxx:xxxx:0:1::/64 dev eth0 proto kernel metric 256 | 
|  | # fe80::/64 dev eth1 proto kernel metric 256 | 
|  | # fe80::/64 dev eth0 proto kernel metric 256 | 
|  | # fe80::/64 dev eth2 proto kernel metric 256 | 
|  |  | 
|  |  | 
|  | ${cmd_output}  ${stderr}  ${rc}=  BMC Execute Command | 
|  | ...  /sbin/ip -6 route | 
|  |  | 
|  | RETURN  ${cmd_output} | 
|  |  | 
|  |  | 
|  | Get Address Origin List And Address For Type | 
|  | [Documentation]  Get address origin list and address for type. | 
|  | [Arguments]  ${ipv6_address_type} | 
|  |  | 
|  | # Description of the argument(s): | 
|  | # ipv6_address_type  Type of IPv6 address to be checked. | 
|  |  | 
|  | ${active_channel_config}=  Get Active Channel Config | 
|  | ${ethernet_interface}=  Set Variable  ${active_channel_config['${CHANNEL_NUMBER}']['name']} | 
|  | ${resp}=  Redfish.Get  ${REDFISH_NW_ETH_IFACE}${active_channel_config['${CHANNEL_NUMBER}']['name']} | 
|  | @{ipv6_addresses}=  Get From Dictionary  ${resp.dict}  IPv6Addresses | 
|  |  | 
|  | ${ipv6_addressorigin_list}=  Create List | 
|  | ${ipv6_slaac_addr}=  Set Variable  ${None} | 
|  | FOR  ${ipv6_address}  IN  @{ipv6_addresses} | 
|  | ${ipv6_addressorigin}=  Get From Dictionary  ${ipv6_address}  AddressOrigin | 
|  | Append To List  ${ipv6_addressorigin_list}  ${ipv6_addressorigin} | 
|  | IF  '${ipv6_addressorigin}' == '${ipv6_address_type}' | 
|  | Set Test Variable  ${ipv6_type_addr}  ${ipv6_address['Address']} | 
|  | END | 
|  | END | 
|  | Should Contain  ${ipv6_addressorigin_list}  ${ipv6_address_type} | 
|  | Should Not Be Empty  ${ipv6_type_addr}  msg=${ipv6_address_type} address is not present | 
|  | RETURN  @{ipv6_addressorigin_list}  ${ipv6_type_addr} | 
|  |  | 
|  |  | 
|  | Verify The Coexistence Of The Address Type | 
|  | [Documentation]  Verify the coexistence of the address type. | 
|  | [Arguments]  @{ipv6_address_types} | 
|  |  | 
|  | # Description of the argument(s): | 
|  | # ipv6_address_types  Types of IPv6 address to be checked. | 
|  |  | 
|  | FOR  ${ipv6_address_type}  IN  @{ipv6_address_types} | 
|  | @{ipv6_address_origin_list}  ${ipv6_type_addr}= | 
|  | ...  Get Address Origin List And Address For Type  ${ipv6_address_type} | 
|  | Should Contain    ${ipv6_address_origin_list}  ${ipv6_address_type} | 
|  | Should Not Be Empty    ${ipv6_type_addr}  msg=${ipv6_address_type} address is not present | 
|  | END |