XYZ network: Verify & delete IP address via REST

This change includes:
    1. Threshold prefix length.
    2. Lowest prefix length.
    3. Get list of all IP addresses via REST.
    4. Delete IP address and its object.
    5. Handles network loss after modifying IP.

This resolves openbmc/openbmc-test-automation#850

Change-Id: Ic426fc661466cd429c348280d08bdda8dac472d3
Signed-off-by: Prashanth Katti <prkatti1@in.ibm.com>
diff --git a/extended/test_network.robot b/extended/test_network.robot
new file mode 100644
index 0000000..3e66bef
--- /dev/null
+++ b/extended/test_network.robot
@@ -0,0 +1,530 @@
+*** Settings ***
+Documentation  Network interface and functionalities test module on BMC.
+
+Resource  ../lib/rest_client.robot
+Resource  ../lib/utils.robot
+Resource  ../lib/bmc_network_utils.robot
+
+Force Tags  Network_Test
+
+Library  String
+Library  SSHLibrary
+
+Test Setup  Test Init Setup
+
+*** Variables ***
+
+${alpha_ip}          xx.xx.xx.xx
+
+# 10.x.x.x series is a private IP address range and does not exist in
+# our network, so this is chosen to avoid IP conflict.
+
+${valid_ip}          10.6.6.6
+${valid_gateway}     10.6.6.1
+${valid_prefix_len}  ${24}
+${broadcast_ip}      10.6.6.255
+${loopback_ip}       127.0.0.1
+${multicast_ip}      224.6.6.255
+${out_of_range_ip}   10.6.6.256
+
+# There will be 4 octets in IP address (e.g. xx.xx.xx.xx)
+# but trying to configure xx.xx.xx
+
+${less_octet_ip}     10.3.36
+
+# For the address 10.6.6.6, the 10.6.6.0 portion describes the
+# network ID and the 6 describe the host.
+
+${network_id}        10.6.6.0
+${hex_ip}            0xa.0xb.0xc.0xd
+${negative_ip}       10.-6.-6.6
+
+*** Test Cases ***
+
+Get BMC IPv4 Address And Verify
+    [Documentation]  Get BMC IPv4 address and verify.
+    [Tags]  Get_BMC_IPv4_Address_And_Verify
+
+    :FOR  ${ipv4_uri}  IN  @{IPv4_URI_List}
+    \  ${ipv4_addr}=  Read Attribute  ${ipv4_uri}  Address
+    \  Validate IP on BMC  ${ipv4_addr}
+
+Verify IPv4 Prefix Length
+    [Documentation]  Get prefix length and verify.
+    [Tags]  Verify_IPv4_Prefix_Length
+
+    :FOR  ${ipv4_uri}  IN  @{IPv4_URI_List}
+    \  ${prefix_length}=  Read Attribute  ${ipv4_uri}  PrefixLength
+    \  Validate Prefix Length On BMC  ${prefix_length}
+
+Verify Gateway Address
+    [Documentation]  Get gateway address and verify.
+    [Tags]  Verify_Gateway_Address
+
+    :FOR  ${ipv4_uri}  IN  @{IPv4_URI_List}
+    \  ${gateway_ip}=  Read Attribute  ${ipv4_uri}  Gateway
+    \  Validate Route On BMC  ${gateway_ip}
+
+Verify MAC Address
+    [Documentation]  Get MAC address and verify.
+    [Tags]  Verify_MAC_Address
+    ${macaddr}=  Read Attribute  ${XYZ_NETWORK_MANAGER}/eth0  MACAddress
+    Validate MAC On BMC  ${macaddr}
+
+Add New Valid IP And Verify
+    [Documentation]  Add new IP address and verify.
+    [Tags]  Add_New_Valid_IP_And_Verify
+
+    Configure Network Settings  ${valid_ip}  ${valid_prefix_len}
+    ...  ${valid_gateway}  valid
+
+    # Verify whether new IP object is created for the given IP via REST.
+    # Delete IP address and IP object after verification.
+    Verify IP Address Via REST And Delete  ${valid_ip}
+
+Configure Invalid IP String
+    # IP Address  Prefix_length        Gateway_IP        Expected_Result
+    ${alpha_ip}   ${valid_prefix_len}  ${valid_gateway}  error
+
+    [Documentation]  Configure invalid IP address which is a string.
+    [Tags]  Configure_Invalid_IP_String
+
+    [Template]  Configure Network Settings
+
+Configure Out Of Range IP
+    # IP Address        Prefix_length        Gateway_IP        Expected_Result
+    ${out_of_range_ip}  ${valid_prefix_len}  ${valid_gateway}  error
+
+    [Documentation]  Configure out-of-range IP address.
+    [Tags]  Configure_Out_Of_Range_IP
+
+    [Template]  Configure Network Settings
+
+Configure Broadcast IP
+    # IP Address     Prefix_length        Gateway_IP        Expected_Result
+    ${broadcast_ip}  ${valid_prefix_len}  ${valid_gateway}  error
+
+    [Documentation]  Configure broadcast IP address.
+    [Tags]  Configure_Broadcast_IP
+
+    [Template]  Configure Network Settings
+
+Configure Multicast IP
+    # IP Address     Prefix_length        Gateway_IP        Expected_Result
+    ${multicast_ip}  ${valid_prefix_len}  ${valid_gateway}  error
+
+    [Documentation]  Configure multicast IP address.
+    [Tags]  Configure_Multicast_IP
+
+    [Template]  Configure Network Settings
+
+Configure Loopback IP
+    # IP Address    Prefix_length        Gateway_IP        Expected_Result
+    ${loopback_ip}  ${valid_prefix_len}  ${valid_gateway}  error
+
+    [Documentation]  Configure loopback IP address.
+    [Tags]  Configure_Loopback_IP
+
+    [Template]  Configure Network Settings
+
+Configure Network ID
+    # IP Address   Prefix_length        Gateway_IP        Expected_Result
+    ${network_id}  ${valid_prefix_len}  ${valid_gateway}  error
+
+    [Documentation]  Configure network ID IP address.
+    [Tags]  Configure_Network_ID
+
+    [Template]  Configure Network Settings
+
+Configure Less Octet IP
+    # IP Address      Prefix_length        Gateway_IP        Expected_Result
+    ${less_octet_ip}  ${valid_prefix_len}  ${valid_gateway}  error
+
+    [Documentation]  Configure less octet IP address.
+    [Tags]  Configure_Less_Octet_IP
+
+    [Template]  Configure Network Settings
+
+Configure Empty IP
+    # IP Address   Prefix_length        Gateway_IP        Expected_Result
+    ${EMPTY}       ${valid_prefix_len}  ${valid_gateway}  error
+
+    [Documentation]  Configure less octet IP address.
+    [Tags]  Configure_Empty_IP
+
+    [Template]  Configure Network Settings
+
+Configure Special Char IP
+    # IP Address     Prefix_length         Gateway_IP        Expected_Result
+    @@@.%%.44.11     ${valid_prefix_len}   ${valid_gateway}  error
+
+    [Documentation]  Configure invalid IP address contaning special chars.
+    [Tags]  Configure_Special_Char_IP
+
+    [Template]  Configure Network Settings
+
+Configure Hexadecimal IP
+    # IP Address  Prefix_length        Gateway_IP        Expected_Result
+    ${hex_ip}     ${valid_prefix_len}  ${valid_gateway}  error
+
+    [Documentation]  Configure invalid IP address contaning hex value.
+    [Tags]  Configure_Hexadecimal_IP
+
+    [Template]  Configure Network Settings
+
+Configure Negative Octet IP
+    # IP Address    Prefix_length        Gateway_IP        Expected_Result
+    ${negative_ip}  ${valid_prefix_len}  ${valid_gateway}  error
+
+    [Documentation]  Configure invalid IP address containing negative octet.
+    [Tags]  Configure_Negative_Octet_IP
+
+    [Template]  Configure Network Settings
+
+Add New Valid IP With Blank Gateway
+    [Documentation]  Add new IP with blank gateway.
+    [Tags]  Add_New_Valid_IP_With_Blank_Gateway
+
+    Configure Network Settings  ${valid_ip}  ${valid_prefix_len}  ${EMPTY}
+    ...  valid
+
+    # Verify whether new IP object is created for the given IP via REST.
+    # Delete IP address and IP object after verification.
+    Verify IP Address Via REST And Delete  ${valid_ip}
+
+Configure Invalid Gateway String
+    # IP Address  Prefix_length        Gateway_IP   Expected_Result
+    ${valid_ip}   ${valid_prefix_len}  ${alpha_ip}  error
+
+    [Documentation]  Configure invalid IP address to a gateway which is
+    ...  an alpha string and expect an error.
+    [Tags]  Configure_Invalid_Gateway_String
+
+    [Template]  Configure Network Settings
+
+Configure Out Of Range IP For Gateway
+    # IP Address  Prefix_length        Gateway_IP          Expected_Result
+    ${valid_ip}   ${valid_prefix_len}  ${out_of_range_ip}  error
+
+    [Documentation]  Configure out-of-range IP for gateway and expect an error.
+    [Tags]  Configure_Out_Of_Range_IP_For_Gateway
+
+    [Template]  Configure Network Settings
+
+Configure Broadcast IP For Gateway
+    # IP Address  Prefix_length        Gateway_IP       Expected_Result
+    ${valid_ip}   ${valid_prefix_len}  ${broadcast_ip}  error
+
+    [Documentation]  Configure broadcast IP for gateway and expect an error.
+    [Tags]  Configure_Broadcast_IP_For_Gateway
+
+    [Template]  Configure Network Settings
+
+Configure Loopback IP For Gateway
+    # IP Address  Prefix_length        Gateway_IP      Expected_Result
+    ${valid_ip}   ${valid_prefix_len}  ${loopback_ip}  error
+
+    [Documentation]  Configure loopback IP for gateway and expect an error.
+    [Tags]  Configure_Loopback_IP_For_Gateway
+
+    [Template]  Configure Network Settings
+
+Configure Multicast IP For Gateway
+    # IP Address  Prefix_length        Gateway_IP       Expected_Result
+    ${valid_ip}   ${valid_prefix_len}  ${multicast_ip}  error
+
+    [Documentation]  Configure multicast IP for gateway and expect an error.
+    [Tags]  Configure_Multicast_IP_For_Gateway
+
+    [Template]  Configure Network Settings
+
+Configure Network ID For Gateway
+    # IP Address  Prefix_length        Gateway_IP     Expected_Result
+    ${valid_ip}   ${valid_prefix_len}  ${network_id}  error
+
+    [Documentation]  Configure network ID for gateway and expect an error.
+    [Tags]  Configure_Network_ID_For_Gateway
+
+    [Template]  Configure Network Settings
+
+Configure Less Octet IP For Gateway
+    # IP Address  Prefix_length        Gateway_IP        Expected_Result
+    ${valid_ip}   ${valid_prefix_len}  ${less_octet_ip}  error
+
+    [Documentation]  Configure less octet IP for gateway and expect an error.
+    [Tags]  Configure_Less_Octet_IP_For_Gateway
+
+    [Template]  Configure Network Settings
+
+Configure Special Char IP For Gateway
+    # IP Address  Prefix_length        Gateway_IP    Expected_Result
+    ${valid_ip}   ${valid_prefix_len}  @@@.%%.44.11  error
+
+    [Documentation]  Configure special char IP for gateway and expect an error.
+    [Tags]  Configure_Special_Char_IP_For_Gateway
+
+    [Template]  Configure Network Settings
+
+Configure Hexadecimal IP For Gateway
+    # IP Address  Prefix_length        Gateway_IP  Expected_Result
+    ${valid_ip}   ${valid_prefix_len}  ${hex_ip}   error
+
+    [Documentation]  Configure hexadecimal IP for gateway and expect an error.
+    [Tags]  Configure_Hexadecimal_IP_For_Gateway
+
+    [Template]  Configure Network Settings
+
+Configure Out Of Range Prefix Length
+    # IP Address  Prefix_length  Gateway_IP  Expected_Result
+    ${valid_ip}   33             ${hex_ip}   error
+
+    [Documentation]  Configure out-of-range prefix length and expect an error.
+    [Tags]  Configure_Out_Of_Range_Prefix_Length
+
+    [Template]  Configure Network Settings
+
+Configure Negative Value For Prefix Length
+    # IP Address  Prefix_length  Gateway_IP  Expected_Result
+    ${valid_ip}   -10            ${hex_ip}   error
+
+    [Documentation]  Configure negative prefix length and expect an error.
+    [Tags]  Configure_Negative_Value_For_Prefix_Length
+
+    [Template]  Configure Network Settings
+
+Configure Non Numeric Value For Prefix Length
+    # IP Address  Prefix_length  Gateway_IP  Expected_Result
+    ${valid_ip}   xx             ${hex_ip}   error
+
+    [Documentation]  Configure non numeric  value prefix length and expect
+    ...  an error.
+    [Tags]  Configure_String_Value_For_Prefix_Length
+
+    [Template]  Configure Network Settings
+
+Add Fourth Octet Threshold IP And Verify
+    [Documentation]  Add fourth octet threshold IP and verify.
+    [Tags]  Add_Fourth_Octet_Threshold_IP_And_Verify
+
+    Configure Network Settings  10.6.6.254  ${valid_prefix_len}
+    ...  ${valid_gateway}  valid
+
+    # Verify whether new IP object is created for the given IP via REST.
+    # Delete IP address and IP object after verification.
+
+    Verify IP Address Via REST And Delete  10.6.6.254
+
+Add Third Octet Threshold IP And Verify
+    [Documentation]  Add third octet threshold IP and verify.
+    [Tags]  Add_Third_Octet_Threshold_IP_And_Verify
+
+    Configure Network Settings  10.6.255.6  ${valid_prefix_len}
+    ...  ${valid_gateway}  valid
+
+    # Verify whether new IP object is created for the given IP via REST.
+    # Delete IP address and IP object after verification.
+
+    Verify IP Address Via REST And Delete  10.6.255.6
+
+Add Second Octet Threshold IP And Verify
+    [Documentation]  Add second octet threshold IP and verify.
+    [Tags]  Add_Second_Octet_Threshold_IP_And_Verify
+
+    Configure Network Settings  10.255.6.6  ${valid_prefix_len}
+    ...  ${valid_gateway}  valid
+
+    # Verify whether new IP object is created for the given IP via REST.
+    # Delete IP address and IP object after verification.
+
+    Verify IP Address Via REST And Delete  10.255.6.6
+
+Add First Octet Threshold IP And Verify
+    [Documentation]  Add first octet threshold IP and verify.
+    [Tags]  Add_First_Octet_Threshold_IP_And_Verify
+
+    Configure Network Settings  223.6.6.6  ${valid_prefix_len}
+    ...  ${valid_gateway}  valid
+
+    # Verify whether new IP object is created for the given IP via REST.
+    # Delete IP address and IP object after verification.
+
+    Verify IP Address Via REST And Delete  223.6.6.6
+
+Configure Lowest Prefix Length
+    [Documentation]  Configure lowest prefix length.
+    [Tags]  Configure_Lowest_Prefix_Length
+
+    Configure Network Settings  ${valid_ip}  ${0}
+    ...  ${valid_gateway}  valid
+
+    # Verify whether new IP object is created for the given IP via REST.
+    # Delete IP address and IP object after verification.
+    Verify IP Address Via REST And Delete  ${valid_ip}
+
+Configure Threshold Prefix Length
+    [Documentation]  Configure threshold prefix length.
+    [Tags]  Configure_Threshold_Prefix_Length
+
+    Configure Network Settings  ${valid_ip}  ${32}
+    ...  ${valid_gateway}  valid
+
+    # Verify whether new IP object is created for the given IP via REST.
+    # Delete IP address and IP object after verification.
+    Verify IP Address Via REST And Delete  ${valid_ip}
+
+Verify Default Gateway
+    [Documentation]  Verify default gateway.
+    [Tags]  Verify that the default gateway has a valid route.
+
+    ${default_gw}=  Read Attribute  ${XYZ_NETWORK_MANAGER}/config
+    ...  DefaultGateway
+    Validate Route On BMC  ${default_gw}
+
+Verify Hostname
+    [Documentation]  Verify that the hostname read via REST is the same as the
+    ...  hostname configured on system.
+    [Tags]  Verify_Hostname
+
+    ${hostname}=  Read Attribute  ${XYZ_NETWORK_MANAGER}/config  HostName
+    Validate Hostname On BMC  ${hostname}
+
+*** Keywords ***
+
+Test Init Setup
+    [Documentation]  Network setup.
+    Open Connection And Login
+
+    @{IPv4_URI_List}=  Get IPv4 URI List
+    Set Test Variable  @{IPv4_URI_List}
+
+    # Get BMC IP address and prefix length.
+    ${ip_data}=  Get BMC IP Info
+    Set Test Variable  ${ip_data}
+
+Get IPv4 URI List
+    [Documentation]  Get all IPv4 URIs.
+
+    # Sample output:
+    #   "data": [
+    #     "/xyz/openbmc_project/network/eth0/ipv4/e9767624",
+    #     "/xyz/openbmc_project/network/eth0/ipv4/31f4ce8b"
+    #   ],
+
+    @{ipv4_uri_list}=  Read Properties  ${XYZ_NETWORK_MANAGER}/eth0/ipv4/
+    Should Not Be Empty  ${ipv4_uri_list}  msg=IPv4 URI list is empty.
+
+    [Return]  @{ipv4_uri_list}
+
+Validate IP On BMC
+    [Documentation]  Validate IP on BMC.
+    [Arguments]  ${ip_address}  ${ip_info}=${ip_data}
+
+    # Description of argument(s):
+    # ip_address  IP address of the system.
+    # ip_info     List of IP address and prefix length values.
+
+    Should Contain Match  ${ip_info}  ${ip_address}*
+    ...  msg=IP address does not exist.
+
+Verify IP Address Via REST And Delete
+    [Documentation]  Verify IP address via REST and delete.
+    [Arguments]  ${ip_addr}
+
+    # Description of argument(s):
+    # ip_addr      IP address to be verified.
+
+    @{ip_uri_list}=  Get IPv4 URI List
+    @{ip_list}=  Get List Of IP Address Via REST  @{ip_uri_list}
+
+    List Should Contain Value  ${ip_list}  ${ip_addr}
+    ...  msg=IP address is not configured.
+
+    # If IP address is configured, delete it.
+    Delete IP And Object  ${ip_addr}  @{ip_uri_list}
+
+Validate Prefix Length On BMC
+    [Documentation]  Validate prefix length on BMC.
+    [Arguments]  ${prefix_length}
+
+    # Description of argument(s):
+    # prefix_length    It indicates netmask, netmask value 255.255.255.0
+    #                  is equal to prefix length 24.
+    # ip_data          Suite variable which has list of IP address and
+    #                  prefix length values.
+
+    Should Contain Match  ${ip_data}  */${prefix_length}
+    ...  msg=Prefix length does not exist.
+
+Validate Route On BMC
+    [Documentation]  Validate route.
+    [Arguments]  ${gateway_ip}
+
+    # Description of argument(s):
+    # gateway_ip  Gateway IP address.
+
+    ${route_info}=  Get BMC Route Info
+    Should Contain  ${route_info}  ${gateway_ip}
+    ...  msg=Gateway IP address not matching.
+
+Validate MAC on BMC
+    [Documentation]  Validate MAC on BMC.
+    [Arguments]  ${macaddr}
+
+    # Description of argument(s):
+    # macaddr  MAC address of the BMC.
+
+    ${system_mac}=  Get BMC MAC Address
+
+    Should Contain  ${system_mac}  ${macaddr}
+    ...  ignore_case=True  msg=MAC address does not exist.
+
+Configure Network Settings
+    [Documentation]  Configure network settings.
+    [Arguments]  ${ip_addr}  ${prefix_len}  ${gateway_ip}  ${expected_result}
+
+    # Description of argument(s):
+    # ip_addr          IP address of BMC.
+    # prefix_len       Prefix length.
+    # gateway_ip       Gateway IP address.
+    # expected_result  Expected status of network setting configuration.
+
+    @{ip_parm_list}=  Create List  xyz.openbmc_project.Network.IP.Protocol.IPv4
+    ...  ${ip_addr}  ${prefix_len}  ${gateway_ip}
+
+    ${data}=  Create Dictionary  data=@{ip_parm_list}
+
+    Run Keyword And Ignore Error  OpenBMC Post Request
+    ...  ${XYZ_NETWORK_MANAGER}/eth0/action/IP  data=${data}
+
+    # After any modification on network interface, BMC restarts network
+    # module, wait until it is reachable.
+
+    Wait For Host To Ping  ${OPENBMC_HOST}  0.3  1
+
+    # Verify whether new IP address is populated on BMC system.
+    # It should not allow to configure invalid settings.
+
+    ${ip_data}=  Get BMC IP Info
+    ${status}=  Run Keyword And Return Status
+    ...  Validate IP On BMC  ${ip_addr}  ${ip_data}
+
+    Run Keyword If  '${expected_result}' == 'error'
+    ...      Should Be Equal  ${status}  ${False}
+    ...      msg=Allowing the configuration of an invalid IP.
+    ...  ELSE
+    ...      Should Be Equal  ${status}  ${True}
+    ...      msg=Not allowing the configuration of a valid IP.
+
+Validate Hostname On BMC
+    [Documentation]  Verify that the hostname read via REST is the same as the
+    ...  hostname configured on system.
+    [Arguments]  ${hostname}
+
+    # Description of argument(s):
+    # hostname  A hostname value which is to be compared to the hostname
+    #           configured on system.
+
+    ${sys_hostname}=  Get BMC Hostname
+
+    Should Contain  ${sys_hostname}  ${hostname}
+    ...  ignore_case=True  msg=Hostname does not exist.