VMI Static And Dynamic IP Configuration Tests

Signed-off-by: Vijay <vikantan@in.ibm.com>
Change-Id: I051661a0aed82992fbde143e056272bb9c9774c5
diff --git a/openpower/ext_interfaces/test_vmi.robot b/openpower/ext_interfaces/test_vmi.robot
new file mode 100644
index 0000000..53e92da
--- /dev/null
+++ b/openpower/ext_interfaces/test_vmi.robot
@@ -0,0 +1,280 @@
+*** Settings ***
+
+Documentation    VMI static/dynamic IP config and certificate exchange tests.
+
+Resource         ../../lib/resource.robot
+Resource         ../../lib/bmc_redfish_resource.robot
+Resource         ../../lib/openbmc_ffdc.robot
+
+Suite Setup       Redfish.Login
+Test Teardown     FFDC On Test Case Fail
+Suite Teardown    Redfish.Logout
+
+*** Variables ***
+
+&{DHCP_ENABLED}           DHCPEnabled=${${True}}
+&{DHCP_DISABLED}          DHCPEnabled=${${False}}
+
+&{ENABLE_DHCP}            DHCPv4=&{DHCP_ENABLED}
+&{DISABLE_DHCP}           DHCPv4=&{DHCP_DISABLED}
+
+
+*** Test Cases ***
+
+Verify All VMI EthernetInterfaces
+    [Documentation]  Verify all VMI ethernet interfaces.
+    [Tags]  Verify_All_VMI_EthernetINterfaces
+
+    Verify VMI EthernetInterfaces
+
+
+Verify Existing VMI Network Interface Details
+    [Documentation]  Verify existing VMI network interface details.
+    [Tags]  Verify_VMI_Network_Interface_Details
+
+    ${vmi_ip}=  Get VMI Network Interface Details
+    ${origin}=  Set Variable If  ${vmi_ip["DHCPv4"]} == ${False}  Static  DHCP
+
+    Should Not Be Equal  ${vmi_ip["DHCPv4"]}  ${vmi_ip["IPv4StaticAddresses"]}
+    Should Be Equal As Strings  ${origin}  ${vmi_ip["IPv4_AddressOrigin"]}
+    Should Be Equal As Strings  ${vmi_ip["Id"]}  intf0
+    Should Be Equal As Strings  ${vmi_ip["Description"]}  Virtual Interface Management Network Interface
+    Should Be Equal As Strings  ${vmi_ip["Name"]}  Virtual Management Ethernet Interface
+    Should Be True  ${vmi_ip["InterfaceEnabled"]}
+
+
+Delete Existing Static VMI IP Address
+    [Documentation]  Delete existing static VMI IP address.
+    [Tags]  Delete_Existing_Static_VMI_IP_Address
+
+    ${curr_origin}=  Get Immediate Child Parameter From VMI Network Interface  DHCPEnabled
+    Run Keyword If  ${curr_origin} == ${True}  Set VMI IPv4 Origin  ${False}  ${HTTP_ACCEPTED}
+
+    Delete VMI IPv4 Address  IPv4StaticAddresses  valid_status_code=${HTTP_ACCEPTED}
+    ${default}=  Set Variable  0.0.0.0
+    Verify VMI Network Interface Details  ${default}  Static  ${default}  ${default}  ${True}
+
+
+Verify User Cannot Delete ReadOnly Property IPv4Addresses
+    [Documentation]  Verify user cannot delete readonly property IPv4Addresses.
+    [Tags]  Verify_User_Cannot_Delete_ReadOnly_Property_IPv4Addresses
+
+    ${curr_origin}=  Get Immediate Child Parameter From VMI Network Interface  DHCPEnabled
+    Run Keyword If  ${curr_origin} == ${False}  Set VMI IPv4 Origin  ${True}  ${HTTP_ACCEPTED}
+    Delete VMI IPv4 Address  IPv4Addresses  valid_status_code=${HTTP_BAD_REQUEST}
+
+
+Assign Static IPv4 Address To VMI
+    [Documentation]  Assign static IPv4 address to VMI.
+    [Tags]  Assign_Static_IPv4_Address_To_VMI
+    [Template]  Verify Assigning Static IPv4 Address To VMI
+
+    # ip          gateway         netmask         del_curr_ip  host_reboot  valid_status_code
+    ${VMI_IP}     ${VMI_GATEWAY}  ${VMI_NETMASK}  ${False}     ${True}      ${HTTP_ACCEPTED}
+    a.3.118.94    ${VMI_GATEWAY}  ${VMI_NETMASK}  ${False}     ${False}     ${HTTP_BAD_REQUEST}
+    10.118.94     10.118.3.Z      ${VMI_NETMASK}  ${False}     ${False}     ${HTTP_BAD_REQUEST}
+
+
+Switch Between IP Origins On VMI And Verify Details
+    [Documentation]  Switch between IP origins on VMI and verify details.
+    [Tags]  Switch_Between_IP_Origins_On_VMI_And_Verify_Details
+
+    Switch VMI IPv4 Origin And Verify Details
+    Switch VMI IPv4 Origin And Verify Details
+
+
+Verify Persistency Of VMI IPv4 Details After Host Reboot
+    [Documentation]  Verify persistency of VMI IPv4 details after host reboot.
+    [Tags]  Verify_Persistency_Of_VMI_IPv4_Details_After_Host_Reboot
+
+    # Verifying persistency of dynamic address.
+    Set VMI IPv4 Origin  ${True}  ${HTTP_ACCEPTED}
+    ${default}=  Set Variable  0.0.0.0
+    Verify VMI Network Interface Details  ${default}  DHCP  ${default}  ${default}  ${True}
+    Verify VMI Network Interface Details  ${default}  DHCP  ${default}  ${default}  ${True}
+
+    # Verifying persistency of static address.
+    Switch VMI IPv4 Origin And Verify Details  ${True}
+    Verify Assigning Static IPv4 Address To VMI  ${VMI_IP}  ${VMI_GATEWAY}  ${VMI_NETMASK}  ${False}
+    Verify VMI Network Interface Details  ${VMI_IP}  Static  ${VMI_GATEWAY}  ${VMI_NETMASK}  ${True}
+
+
+*** Keywords ***
+
+Get VMI Network Interface Details
+    [Documentation]  Get VMI network interface details.
+    [Arguments]  ${valid_status_code}=${HTTP_OK}
+
+    # Description of argument(s):
+    # valid_status_code  Expected valid status code from GET request.
+
+    # Note: It returns a dictionary of VMI intf0 parameters.
+
+    ${resp}=  Redfish.Get  /redfish/v1/Systems/hypervisor/EthernetInterfaces/intf0
+    ...  valid_status_codes=[${valid_status_code}]
+
+    ${ip_resp}=  Evaluate  json.loads('''${resp.text}''')  json
+
+    ${static_exists}=  Run Keyword And Ignore Error
+    ...  Set Variable  ${ip_resp["IPv4StaticAddresses"][0]["Address"]}
+    ${static_exists}=  Set Variable If  '${static_exists[0]}' == 'PASS'  ${True}  ${False}
+
+    ${vmi_ip}=  Create Dictionary  DHCPv4=${${ip_resp["DHCPv4"]["DHCPEnabled"]}}  Id=${ip_resp["Id"]}
+    ...  Description=${ip_resp["Description"]}  IPv4_Address=${ip_resp["IPv4Addresses"][0]["Address"]}
+    ...  IPv4_AddressOrigin=${ip_resp["IPv4Addresses"][0]["AddressOrigin"]}  Name=${ip_resp["Name"]}
+    ...  IPv4_Gateway=${ip_resp["IPv4Addresses"][0]["Gateway"]}  InterfaceEnabled=${${ip_resp["InterfaceEnabled"]}}
+    ...  IPv4_SubnetMask=${ip_resp["IPv4Addresses"][0]["SubnetMask"]}  MACAddress=${ip_resp["MACAddress"]}
+    ...  IPv4StaticAddresses=${${static_exists}}
+
+    [Return]  &{vmi_ip}
+
+
+Get Immediate Child Parameter From VMI Network Interface
+    [Documentation]  Get immediate child parameter from VMI network interface.
+    [Arguments]  ${parameter}  ${valid_status_code}=${HTTP_OK}
+
+    # Description of argument(s):
+    # parameter          parameter for which value is required. Ex: DHCPEnabled, MACAddress etc.
+    # valid_status_code  Expected valid status code from GET request.
+
+    ${resp}=  Redfish.Get  /redfish/v1/Systems/hypervisor/EthernetInterfaces/intf0
+    ...  valid_status_codes=[${valid_status_code}]
+
+    ${ip_resp}=  Evaluate  json.loads('''${resp.text}''')  json
+    ${value}=  Set Variable If  '${parameter}' != 'DHCPEnabled'   ${ip_resp["${parameter}"]}
+    ...  ${ip_resp["DHCPv4"]["${parameter}"]}
+
+    [Return]  ${value}
+
+
+Verify VMI EthernetInterfaces
+    [Documentation]  Verify VMI ethernet interfaces.
+    [Arguments]  ${valid_status_code}=${HTTP_OK}
+
+    # Description of argument(s):
+    # valid_status_code  Expected valid status code from GET request.
+
+    ${resp}=  Redfish.Get  /redfish/v1/Systems/hypervisor/EthernetInterfaces
+    ...  valid_status_codes=[${valid_status_code}]
+
+    ${resp}=  Evaluate  json.loads('''${resp.text}''')  json
+    ${interfaces}=  Set Variable  ${resp["Members"]}
+
+    Should Be Equal As Strings  ${interfaces[0]}[@odata.id]
+    ...  /redfish/v1/Systems/hypervisor/EthernetInterfaces/intf0
+    Should Be Equal As Strings  ${interfaces[1]}[@odata.id]
+    ...  /redfish/v1/Systems/hypervisor/EthernetInterfaces/intf1
+
+    Should Be Equal  ${resp["Members@odata.count"]}  ${2}
+
+
+Verify VMI Network Interface Details
+    [Documentation]  Verify VMI network interface details.
+    [Arguments]  ${ip}  ${origin}  ${gateway}  ${netmask}
+    ...  ${host_reboot}=${False}  ${valid_status_code}=${HTTP_OK}
+
+    # Description of argument(s):
+    # ip                 VMI IPv4 address.
+    # origin             Origin of IPv4 address eg. Static or DHCP.
+    # gateway            Gateway for VMI IP.
+    # netmask            Subnetmask for VMI IP.
+    # valid_status_code  Expected valid status code from GET request. Default is HTTP_OK.
+    # host_reboot        Reboot HOST if True.
+
+    Run Keyword If  ${host_reboot} == ${True}  Run Keywords
+    ...  Redfish Power Off  AND  Redfish Power On  AND  Redfish.Login
+
+    ${vmi_ip}=  Get VMI Network Interface Details  ${valid_status_code}
+    Should Be Equal As Strings  ${origin}  ${vmi_ip["IPv4_AddressOrigin"]}
+    Should Be Equal As Strings  ${gateway}  ${vmi_ip["IPv4_Gateway"]}
+    Should Be Equal As Strings  ${netmask}  ${vmi_ip["IPv4_SubnetMask"]}
+
+    Return From Keyword If  '${origin}' == 'DHCP'
+    Should Be Equal As Strings  ${ip}  ${vmi_ip["IPv4_Address"]}
+
+
+Set Static IPv4 Address To VMI
+    [Documentation]  Set static IPv4 address to VMI.
+    [Arguments]  ${ip}  ${gateway}  ${netmask}  ${valid_status_code}=${HTTP_ACCEPTED}
+
+    # Description of argument(s):
+    # ip                 VMI IPv4 address.
+    # gateway            Gateway for VMI IP.
+    # netmask            Subnetmask for VMI IP.
+    # valid_status_code  Expected valid status code from GET request. Default is HTTP_ACCEPTED.
+
+    ${data}=  Set Variable
+    ...  {"IPv4StaticAddresses": [{"Address": "${ip}","SubnetMask": "${netmask}","Gateway": "${gateway}"}]}
+
+    ${resp}=  Redfish.Patch  /redfish/v1/Systems/hypervisor/EthernetInterfaces/intf0  body=${data}
+    ...  valid_status_codes=[${valid_status_code}]
+    Redfish Power On  stack_mode=skip
+    Log To Console  ${resp.text}
+
+
+Verify Assigning Static IPv4 Address To VMI
+    [Documentation]    Verify assigning static IPv4 address to VMI.
+    [Arguments]  ${ip}  ${gateway}  ${netmask}  ${del_curr_ip}=${True}  ${host_reboot}=${True}
+    ...  ${valid_status_code}=${HTTP_ACCEPTED}
+
+    # Description of argument(s):
+    # ip                 VMI IPv4 address.
+    # gateway            Gateway for VMI IP.
+    # netmask            Subnetmask for VMI IP.
+    # del_curr_ip        Delete current VMI static IP if True.
+    # host_reboot        True when HOST reboot is required.
+    # valid_status_code  Expected valid status code from GET request. Default is HTTP_ACCEPTED.
+
+    # Delete current static IP based on user input.
+    ${curr_origin}=  Get Immediate Child Parameter From VMI Network Interface  DHCPEnabled
+    Run Keyword If  ${curr_origin} == ${False} and ${del_curr_ip} == ${True}  Delete VMI IPv4 Address
+
+    Set Static IPv4 Address To VMI  ${ip}  ${gateway}  ${netmask}  valid_status_code=${valid_status_code}
+    Return From Keyword If  ${valid_status_code} != ${HTTP_ACCEPTED}
+
+    Verify VMI Network Interface Details  ${ip}  Static  ${gateway}  ${netmask}  host_reboot=${host_reboot}
+
+
+Delete VMI IPv4 Address
+    [Documentation]  Delete VMI IPv4 address.
+    [Arguments]  ${delete_param}=IPv4StaticAddresses  ${valid_status_code}=${HTTP_ACCEPTED}
+
+    # Description of argument(s):
+    # delete_param       Parameter to be deleted eg. IPv4StaticAddresses or IPv4Addresses.
+    #                    Default is IPv4StaticAddresses.
+    # valid_status_code  Expected valid status code from PATCH request. Default is HTTP_OK.
+
+    ${data}=  Set Variable  {"${delete_param}": [${Null}]}
+    ${resp}=  Redfish.Patch  /redfish/v1/Systems/hypervisor/EthernetInterfaces/intf0  body=${data}
+    ...  valid_status_codes=[${valid_status_code}]
+
+
+Set VMI IPv4 Origin
+    [Documentation]  Set VMI IPv4 origin.
+    [Arguments]  ${dhcp_enabled}=${False}  ${valid_status_code}=${HTTP_ACCEPTED}
+
+    # Description of argument(s):
+    # dhcp_enabled       True if user wants to enable DHCP. Default is Static, hence value is set to False.
+    # valid_status_code  Expected valid status code from PATCH request. Default is HTTP_OK.
+
+    ${data}=  Set Variable If  ${dhcp_enabled} == ${False}  ${DISABLE_DHCP}  ${ENABLE_DHCP}
+    ${resp}=  Redfish.Patch  /redfish/v1/Systems/hypervisor/EthernetInterfaces/intf0  body=${data}
+    ...  valid_status_codes=[${valid_status_code}]
+
+
+Switch VMI IPv4 Origin And Verify Details
+    [Documentation]  Switch VMI IPv4 origin and verify details.
+    [Arguments]  ${host_reboot}=${False}
+
+    # Description of argument(s):
+    # host_reboot        Reboot HOST if True.
+
+    ${curr_mode}=  Get Immediate Child Parameter From VMI Network Interface  DHCPEnabled
+    ${dhcp_enabled}=  Set Variable If  ${curr_mode} == ${False}  ${True}  ${False}
+
+    ${default}=  Set Variable  0.0.0.0
+    ${origin}=  Set Variable If  ${curr_mode} == ${False}  DHCP  Static
+    Set VMI IPv4 Origin  ${dhcp_enabled}  ${HTTP_ACCEPTED}
+    Verify VMI Network Interface Details  ${default}  ${origin}  ${default}  ${default}  ${host_reboot}
+
+    [Return]  ${origin}