Enable test cases for host's network settings

What test cases are added
    - Added test cases to set static and dhcp setting using REST
    - Added test cases to set static and dhcp setting using IPMI
    - Added test case to clear settings using IPMI
    - Added test cases to set invalid settings using both REST and IPMI

Resolves openbmc/openbmc-test-automation#48

Change-Id: Ia9ac56ad884318de703406d070aa7985474fab05
Signed-off-by: Rahul Maheshwari <rahulmaheshwari@in.ibm.com>
diff --git a/extended/test_host_network.robot b/extended/test_host_network.robot
new file mode 100644
index 0000000..d3b9bf9
--- /dev/null
+++ b/extended/test_host_network.robot
@@ -0,0 +1,193 @@
+*** Settings ***
+
+Documentation   This testsuite is for testing network setting
+...             of host OS.
+
+Resource            ../lib/rest_client.robot
+Resource            ../lib/ipmi_client.robot
+Resource            ../lib/utils.robot
+Resource            ../lib/openbmc_ffdc.robot
+Library             ../lib/utilities.py
+
+Suite Setup         Open Connection And Log In
+Suite Teardown      Close All Connections
+
+Test Teardown       Post Test Execution
+
+*** Variables ***
+${SET_ADDR_PREFIX}  0x00 0x08 0x61 0x80 0x21 0x70 0x62 0x21 0x00 0x01 0x06 0x04
+${STATIC}           0x00 0x01                       #equivalent address type 1
+${DHCP}             0x00 0x00                       #equivalent address type 0
+${CLEAR_ADDR}       0x00 0x08 0x61 0x80 0x00 0x00 0x00 0x00
+${INVALID_MAC}      f4:52:14
+
+*** Test Cases ***
+
+Set Static Address With REST
+    [Documentation]   This testcase is to set static address for host's network
+    ...               setting using REST. Later verify using REST
+    ...               that it is set correctly.
+    [Tags]  Set_Static_Address_With_REST
+
+    ${ip_address}=  utilities.random_ip
+    ${gateway}=  utilities.random_ip
+    ${mac_address}=  utilities.random_mac
+    ${subnet}=  Evaluate    random.randint(0, 32)    modules=random
+
+    ${settings}=  Catenate   SEPARATOR=
+    ...    ipaddress=${ip_address},prefix=${subnet},
+    ...    gateway=${gateway},mac=${mac_address},addr_type=1
+
+    Set Network Override Setting   ${settings}
+
+    ${resp}=  Read Attribute  /org/openbmc/settings/host0    network_config
+    Should Be Equal    ${resp}   ${settings}
+
+
+Set DHCP Address With REST
+    [Documentation]   This testcase is to set dhcp address for host's network
+    ...               setting using REST. Later verify using REST that it
+    ...               is set correctly.
+    [Tags]  Set_DHCP_Address_With_REST
+
+    ${mac_address}=  utilities.random_mac
+
+    ${settings}=  Catenate   SEPARATOR=
+    ...    ipaddress=,prefix=,gateway=,mac=${mac_address},addr_type=0
+
+    Set Network Override Setting   ${settings}
+
+    ${resp}=  Read Attribute  /org/openbmc/settings/host0    network_config
+    Should Be Equal    ${resp}    ${settings}
+
+
+Set Static Address With IPMI
+    [Documentation]   This testcase is to set static address for host's network
+    ...               setting using IPMI. Later verify using REST that it is
+    ...               set correctly.
+    [Tags]  Set_Static_Address_With_IPMI
+
+    ${ip_address}=  utilities.random_ip
+    ${gateway}=  utilities.random_ip
+    ${mac_address}=  utilities.random_mac
+    ${subnet}=  Evaluate    random.randint(0, 32)    modules=random
+
+    ${mac_address_hex}=  Mac Address To Hex String    ${mac_address}
+    ${ip_address_hex}=  IP Address To Hex String      ${ip_address}
+    ${gateway_hex}=  IP Address To Hex String      ${gateway}
+    ${subnet_hex}=  Convert To Hex    ${subnet}    prefix=0x
+    ...    lowercase=yes
+
+    ${ipmi_raw_cmd}=  Catenate  SEPARATOR=
+    ...    ${SET_ADDR_PREFIX}${SPACE}${mac_address_hex}${SPACE}${STATIC}${SPACE}
+    ...    ${ip_address_hex}${SPACE}${subnet_hex}${SPACE}${gateway_hex}
+
+    Run IPMI command   ${ipmi_raw_cmd}
+
+    ${resp}=  Read Attribute  /org/openbmc/settings/host0    network_config
+
+    ${settings}=  Catenate   SEPARATOR=
+    ...    ipaddress=${ip_address},prefix=${subnet},gateway=${gateway},
+    ...    mac=${mac_address},addr_type=1
+
+    Should Be Equal    ${resp}    ${settings}
+
+
+Set DHCP Address With IPMI
+    [Documentation]   This testcase is to set dhcp address for host's network
+    ...               setting using IPMI. Later verify using REST that it is
+    ...               set correctly.
+    [Tags]  Set_DHCP_Address_With_IPMI
+
+    ${mac_address}=  utilities.random_mac
+    ${mac_address_hex}=  Mac Address To Hex String    ${mac_address}
+
+    ${ipmi_raw_cmd}=  Catenate  SEPARATOR=
+    ...    ${SET_ADDR_PREFIX}${SPACE}${mac_address_hex}${SPACE}${DHCP}
+    Run IPMI command   ${ipmi_raw_cmd}
+
+    ${resp}=  Read Attribute  /org/openbmc/settings/host0    network_config
+    Should Contain    ${resp}    addr_type=0
+
+
+Clear Address With IPMI
+    [Documentation]   This testcase is to clear host's network setting
+    ...               using IPMI. Later verify using REST that it is
+    ...               cleared.
+    [Tags]  Clear_Address_With_IPMI
+
+    Run IPMI command   ${CLEAR_ADDR}
+
+    ${resp}=  Read Attribute  /org/openbmc/settings/host0    network_config
+    Should Be Equal    ${resp}    ipaddress=,prefix=,gateway=,mac=,addr_type=
+
+
+Set Invalid Address With REST
+    [Documentation]   This testcase is to verify that proper error message is
+    ...               prompted by REST with invalid mac address for
+    ...               host's network setting.
+    [Tags]  Set_Invalid_Address_With_REST
+
+    ${ip_address}=  utilities.random_ip
+    ${gateway}=  utilities.random_ip
+    ${subnet}=  Evaluate    random.randint(0, 32)    modules=random
+
+    ${invalid_settings}=  Catenate   SEPARATOR=
+    ...    ipaddress=${ip_address},prefix=${subnet},gateway=${gateway},
+    ...    mac=${INVALID_MAC},addr_type=1
+
+    ${resp}=  Set Network Override Setting   ${invalid_settings}
+    Should Be Equal    ${resp}    error
+
+
+Set Invalid Address With IPMI
+    [Documentation]   This testcase is to verify that invalid mac address for
+    ...               host's network setting can not be set by IPMI.
+    [Tags]  Set_Invalid_Address_With_IPMI
+
+    ${ip_address}=  utilities.random_ip
+    ${gateway}=  utilities.random_ip
+    ${subnet}=  Evaluate    random.randint(0, 32)    modules=random
+
+    ${ip_address_hex}=  IP Address To Hex String      ${ip_address}
+    ${gateway_hex}=  IP Address To Hex String      ${gateway}
+    ${invalid_mac_hex}=  Mac Address To Hex String    ${INVALID_MAC}
+    ${subnet_hex}=  Convert To Hex    ${subnet}    prefix=0x
+    ...    lowercase=yes
+
+    ${ipmi_raw_cmd}=  Catenate  SEPARATOR=
+    ...    ${SET_ADDR_PREFIX}${SPACE}${invalid_mac_hex}${SPACE}${STATIC}${SPACE}
+    ...    ${ip_address_hex}${SPACE}${subnet_hex}${SPACE}${gateway_hex}
+    Run IPMI command   ${ipmi_raw_cmd}
+
+    ${invalid_settings}=  Catenate   SEPARATOR=
+    ...    ipaddress=${ip_address},prefix=${subnet},gateway=${gateway},
+    ...    mac=${INVALID_MAC},addr_type=1
+
+    ${resp}=  Read Attribute  /org/openbmc/settings/host0    network_config
+    Should Not Be Equal    ${resp}    ${invalid_settings}
+
+
+*** Keywords ***
+
+Set Network Override Setting
+    [Documentation]  Set host's network settings with passed arguments and
+    ...              return its status.
+    ...              Description of arguments:
+    ...              settings  Network settings which need to be set
+    [Arguments]    ${settings}
+    ${host_network}=  Set Variable   ${settings}
+    ${valueDict}=  create dictionary   data=${host_network}
+    ${resp}=   OpenBMC Put Request
+    ...    /org/openbmc/settings/host0/attr/network_config    data=${valueDict}
+    ${jsondata}=  to json    ${resp.content}
+    [return]    ${jsondata['status']}
+
+Post Test Execution
+    [Documentation]  Perform operations after test execution. Captures FFDC
+    ...              in case of test case failure and sets defaults values
+    ...              for host's network settings.
+
+    FFDC On Test Case Fail
+
+    Run IPMI command   ${CLEAR_ADDR}