IPv6: support ping6 in Check Ping keyword
[integration/test.git] / csit / libraries / OpenStackOperations.robot
index bad852df2dae537a9ece3c9c929c5df49f681786..8005a9331a102d290c56a865bcd9ba8dfe410647 100644 (file)
@@ -1,10 +1,11 @@
 *** Settings ***
 Documentation     Openstack library. This library is useful for tests to create network, subnet, router and vm instances
 Library           SSHLibrary
-Resource          Netvirt.robot
+Resource          DataModels.robot
 Resource          Utils.robot
 Resource          L2GatewayOperations.robot
 Resource          ../variables/Variables.robot
+Variables         ../variables/netvirt/Modules.py
 
 *** Keywords ***
 Source Password
@@ -37,6 +38,26 @@ Create Network
     Log    ${output}
     [Return]    ${output}
 
+Update Network
+    [Arguments]    ${network_name}    ${additional_args}=${EMPTY}
+    [Documentation]    Update Network with neutron request.
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${output}=    Write Commands Until Prompt    neutron -v net-update ${network_name} ${additional_args}    30s
+    Log    ${output}
+    Close Connection
+    [Return]    ${output}
+
+Show Network
+    [Arguments]    ${network_name}
+    [Documentation]    Show Network with neutron request.
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${output}=    Write Commands Until Prompt    neutron -v net-show ${network_name}    30s
+    Log    ${output}
+    Close Connection
+    [Return]    ${output}
+
 List Networks
     [Documentation]    List networks and return output with neutron client.
     ${devstack_conn_id}=    Get ControlNode Connection
@@ -75,6 +96,26 @@ Create SubNet
     Log    ${output}
     Should Contain    ${output}    Created a new subnet
 
+Update SubNet
+    [Arguments]    ${subnet_name}    ${additional_args}=${EMPTY}
+    [Documentation]    Update subnet with neutron request.
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${output}=    Write Commands Until Prompt    neutron -v subnet-update ${subnet_name} ${additional_args}    30s
+    Log    ${output}
+    Close Connection
+    [Return]    ${output}
+
+Show SubNet
+    [Arguments]    ${subnet_name}
+    [Documentation]    Show subnet with neutron request.
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${output}=    Write Commands Until Prompt    neutron -v subnet-show ${subnet_name}    30s
+    Log    ${output}
+    Close Connection
+    [Return]    ${output}
+
 Create Port
     [Arguments]    ${network_name}    ${port_name}    ${sg}=default    ${additional_args}=${EMPTY}
     [Documentation]    Create Port with neutron request.
@@ -85,6 +126,26 @@ Create Port
     Log    ${output}
     Should Contain    ${output}    Created a new port
 
+Update Port
+    [Arguments]    ${port_name}    ${additional_args}=${EMPTY}
+    [Documentation]    Update port with neutron request.
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${output}=    Write Commands Until Prompt    neutron -v port-update ${port_name} ${additional_args}    30s
+    Log    ${output}
+    Close Connection
+    [Return]    ${output}
+
+Show Port
+    [Arguments]    ${port_name}
+    [Documentation]    Show port with neutron request.
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${output}=    Write Commands Until Prompt    neutron -v port-show ${port_name}    30s
+    Log    ${output}
+    Close Connection
+    [Return]    ${output}
+
 Delete Port
     [Arguments]    ${port_name}
     [Documentation]    Delete Port with neutron request.
@@ -231,6 +292,25 @@ Create Vm Instances
     \    ${output}=    Write Commands Until Prompt    nova boot --image ${image} --flavor ${flavor} --nic net-id=${net_id} ${VmElement} --security-groups ${sg}    30s
     \    Log    ${output}
 
+Create Vm Instance With Port
+    [Arguments]    ${port_name}    ${vm_instance_name}    ${image}=cirros-0.3.4-x86_64-uec    ${flavor}=m1.nano    ${sg}=default
+    [Documentation]    Create One VM instance using given ${port_name} and for given ${compute_node}
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${port_id}=    Get Port Id    ${port_name}    ${devstack_conn_id}
+    ${output}=    Write Commands Until Prompt    nova boot --image ${image} --flavor ${flavor} --nic port-id=${port_id} ${vm_instance_name} --security-groups ${sg}    30s
+    Log    ${output}
+
+Create Vm Instance With Ports
+    [Arguments]    ${port_name}    ${port2_name}    ${vm_instance_name}    ${image}=cirros-0.3.4-x86_64-uec    ${flavor}=m1.nano    ${sg}=default
+    [Documentation]    Create One VM instance using given ${port_name} and for given ${compute_node}
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${port_id}=    Get Port Id    ${port_name}    ${devstack_conn_id}
+    ${port2_id}=    Get Port Id    ${port2_name}    ${devstack_conn_id}
+    ${output}=    Write Commands Until Prompt    nova boot --image ${image} --flavor ${flavor} --nic port-id=${port_id} --nic port-id=${port2_id} ${vm_instance_name} --security-groups ${sg}    30s
+    Log    ${output}
+
 Create Vm Instance With Port On Compute Node
     [Arguments]    ${port_name}    ${vm_instance_name}    ${compute_node}    ${image}=cirros-0.3.4-x86_64-uec    ${flavor}=m1.nano    ${sg}=default
     [Documentation]    Create One VM instance using given ${port_name} and for given ${compute_node}
@@ -279,6 +359,26 @@ Collect VM IP Addresses
     Return From Keyword If    ${dhcp_length}==0    ${ip_list}    ${EMPTY}
     [Return]    ${ip_list}    ${dhcp_ip}
 
+Collect VM IPv6 SLAAC Addresses
+    [Arguments]    ${fail_on_none}    ${prefix}    @{vm_list}
+    [Documentation]    Using nova console-log on the provided ${vm_list} to search for the string "inet6" which
+    ...    correlates to the instance generated IPv6 address, based on the ${prefix} received from ODL (SLAAC mode).
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${ip_list}    Create List    @{EMPTY}
+    : FOR    ${vm}    IN    @{vm_list}
+    \    Log    ${vm}
+    \    ${vm_ip_line}=    Write Commands Until Prompt    nova console-log ${vm} | grep -i "inet6"    30s
+    \    Log    ${vm_ip_line}
+    \    @{vm_ip_list}    Get Regexp Matches    ${vm_ip_line}    ${prefix}
+    \    ${vm_ip_length}    Get Length    ${vm_ip_list}
+    \    Run Keyword If    ${vm_ip_length}>0    Append To List    ${ip_list}    @{vm_ip_list}[0]
+    \    ...    ELSE    Append To List    ${ip_list}    None
+    \    Log    ${ip_list}
+    Run Keyword If    '${fail_on_none}' == 'true'    Should Not Contain    ${ip_list}    None
+    Log    ${ip_list}
+    [Return]    ${ip_list}
+
 View Vm Console
     [Arguments]    ${vm_instance_names}
     [Documentation]    View Console log of the created vm instances using nova show.
@@ -315,12 +415,12 @@ Ping From DHCP Should Not Succeed
     Should Not Contain    ${output}    64 bytes
 
 Ping Vm From Control Node
-    [Arguments]    ${vm_floating_ip}
+    [Arguments]    ${vm_floating_ip}    ${additional_args}=${EMPTY}
     [Documentation]    Ping VM floating IP from control node
     Log    ${vm_floating_ip}
     ${devstack_conn_id}=    Get ControlNode Connection
     Switch Connection    ${devstack_conn_id}
-    ${output}=    Write Commands Until Prompt    ping -c 3 ${vm_floating_ip}    20s
+    ${output}=    Write Commands Until Prompt    ping ${additional_args} -c 3 ${vm_floating_ip}    20s
     Log    ${output}
     Close Connection
     Should Contain    ${output}    64 bytes
@@ -355,9 +455,11 @@ Exit From Vm Console
     Run Keyword If    ${rcode}    Write Commands Until Prompt    exit
 
 Check Ping
-    [Arguments]    ${ip_address}
+    [Arguments]    ${ip_address}    ${ttl}=64
     [Documentation]    Run Ping command on the IP available as argument
-    ${output}=    Write Commands Until Expected Prompt    ping -c 3 ${ip_address}    ${OS_SYSTEM_PROMPT}
+    ${ethertype}=    Get Regexp Matches    ${ip_address}    ${IP_REGEX}
+    ${output}=    Run Keyword If    ${ethertype}    Write Commands Until Expected Prompt    ping -t ${ttl} -c 3 ${ip_address}    ${OS_SYSTEM_PROMPT}
+    ...    ELSE    Write Commands Until Expected Prompt    ping6 -t ${ttl} -c 3 ${ip_address}    ${OS_SYSTEM_PROMPT}
     Should Contain    ${output}    64 bytes
 
 Check Metadata Access
@@ -382,7 +484,7 @@ Execute Command on VM Instance
     [Return]    ${output}
 
 Test Operations From Vm Instance
-    [Arguments]    ${net_name}    ${src_ip}    ${dest_ips}    ${user}=cirros    ${password}=cubswin:)
+    [Arguments]    ${net_name}    ${src_ip}    ${dest_ips}    ${user}=cirros    ${password}=cubswin:)    ${ttl}=64
     [Documentation]    Login to the vm instance using ssh in the network.
     ${devstack_conn_id}=    Get ControlNode Connection
     Switch Connection    ${devstack_conn_id}
@@ -395,23 +497,16 @@ Test Operations From Vm Instance
     ${rcode}=    Run Keyword And Return Status    Check If Console Is VmInstance
     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    ifconfig    ${OS_SYSTEM_PROMPT}
     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    route    ${OS_SYSTEM_PROMPT}
+    Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    route -A inet6    ${OS_SYSTEM_PROMPT}
     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    arp -an    ${OS_SYSTEM_PROMPT}
     : FOR    ${dest_ip}    IN    @{dest_ips}
     \    Log    ${dest_ip}
     \    ${string_empty}=    Run Keyword And Return Status    Should Be Empty    ${dest_ip}
     \    Run Keyword If    ${string_empty}    Continue For Loop
-    \    Run Keyword If    ${rcode}    Check Ping    ${dest_ip}
+    \    Run Keyword If    ${rcode}    Check Ping    ${dest_ip}    ttl=${ttl}
     Run Keyword If    ${rcode}    Check Metadata Access
     [Teardown]    Exit From Vm Console
 
-Install Netcat On Controller
-    [Documentation]    Installs Netcat on the controller - this probably shouldn't be here
-    ${devstack_conn_id}=    Get ControlNode Connection
-    Switch Connection    ${devstack_conn_id}
-    ${output}=    Write Commands Until Prompt    sudo yum install -y nc
-    Log    ${output}
-    Close Connection
-
 Test Netcat Operations From Vm Instance
     [Arguments]    ${net_name}    ${vm_ip}    ${dest_ip}    ${additional_args}=${EMPTY}    ${port}=12345    ${user}=cirros
     ...    ${password}=cubswin:)
@@ -582,12 +677,12 @@ Get OvsDebugInfo
 Get Test Teardown Debugs
     [Arguments]    ${test_name}=${TEST_NAME}
     Get OvsDebugInfo
-    Run Keyword And Ignore Error    Get Model Dump    ${HA_PROXY_IP}
+    Run Keyword And Ignore Error    Get Model Dump    ${HA_PROXY_IP}    ${netvirt_data_models}
     Get Karaf Log Events From Test Start    ${test_name}
 
 Get Suite Teardown Debugs
     Get OvsDebugInfo
-    Get Model Dump    ${HA_PROXY_IP}
+    Get Model Dump    ${HA_PROXY_IP}    ${netvirt_data_models}
 
 Show Debugs
     [Arguments]    @{vm_indices}
@@ -858,3 +953,143 @@ Create And Configure Security Group
     Neutron Security Group Rule Create    ${sg-name}    direction=egress    protocol=icmp    remote_ip_prefix=0.0.0.0/0
     Neutron Security Group Rule Create    ${sg-name}    direction=ingress    port_range_max=65535    port_range_min=1    protocol=udp    remote_ip_prefix=0.0.0.0/0
     Neutron Security Group Rule Create    ${sg-name}    direction=egress    port_range_max=65535    port_range_min=1    protocol=udp    remote_ip_prefix=0.0.0.0/0
+
+Create SFC Flow Classifier
+    [Arguments]    ${name}    ${src_ip}    ${dest_ip}    ${protocol}    ${dest_port}    ${neutron_src_port}
+    [Documentation]    Create a flow classifier for SFC
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${cmd}=    Set Variable    neutron flow-classifier-create --ethertype IPv4 --source-ip-prefix ${src_ip}/32 --destination-ip-prefix ${dest_ip}/32 --protocol ${protocol} --destination-port ${dest_port}:${dest_port} --logical-source-port ${neutron_src_port} ${name}
+    Log    ${cmd}
+    ${output}=    Write Commands Until Prompt    ${cmd}    30s
+    Log    ${output}
+    Close Connection
+    Should Contain    ${output}    Created a new flow_classifier
+    [Return]    ${output}
+
+Delete SFC Flow Classifier
+    [Arguments]    ${name}
+    [Documentation]    Delete a SFC flow classifier
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${cmd}=    Set Variable    neutron flow-classifier-delete ${name}
+    Log    ${cmd}
+    ${output}=    Write Commands Until Prompt    ${cmd}    30s
+    Log    ${output}
+    Close Connection
+    Should Contain    ${output}    Deleted flow_classifier
+    [Return]    ${output}
+
+Create SFC Port Pair
+    [Arguments]    ${name}    ${port_in}    ${port_out}
+    [Documentation]    Creates a neutron port pair for SFC
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${cmd}=    Set Variable    neutron port-pair-create --ingress=${port_in} --egress=${port_out} ${name}
+    Log    ${cmd}
+    ${output}=    Write Commands Until Prompt    ${cmd}    30s
+    Log    ${output}
+    Close Connection
+    Should Contain    ${output}    Created a new port_pair
+    [Return]    ${output}
+
+Delete SFC Port Pair
+    [Arguments]    ${name}
+    [Documentation]    Delete a SFC port pair
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${cmd}=    Set Variable    neutron port-pair-delete ${name}
+    Log    ${cmd}
+    ${output}=    Write Commands Until Prompt    ${cmd}    30s
+    Log    ${output}
+    Close Connection
+    Should Contain    ${output}    Deleted port_pair
+    [Return]    ${output}
+
+Create SFC Port Pair Group
+    [Arguments]    ${name}    ${port_pair}
+    [Documentation]    Creates a port pair group with a single port pair for SFC
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${cmd}=    Set Variable    neutron port-pair-group-create --port-pair ${port_pair} ${name}
+    Log    ${cmd}
+    ${output}=    Write Commands Until Prompt    ${cmd}    30s
+    Log    ${output}
+    Close Connection
+    Should Contain    ${output}    Created a new port_pair_group
+    [Return]    ${output}
+
+Create SFC Port Pair Group With Two Pairs
+    [Arguments]    ${name}    ${port_pair1}    ${port_pair2}
+    [Documentation]    Creates a port pair group with two port pairs for SFC
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${cmd}=    Set Variable    neutron port-pair-group-create --port-pair ${port_pair1} --port-pair ${port_pair2} ${name}
+    Log    ${cmd}
+    ${output}=    Write Commands Until Prompt    ${cmd}    30s
+    Log    ${output}
+    Close Connection
+    Should Contain    ${output}    Created a new port_pair_group
+    [Return]    ${output}
+
+Delete SFC Port Pair Group
+    [Arguments]    ${name}
+    [Documentation]    Delete a SFC port pair group
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${cmd}=    Set Variable    neutron port-pair-group-delete ${name}
+    Log    ${cmd}
+    ${output}=    Write Commands Until Prompt    ${cmd}    30s
+    Log    ${output}
+    Close Connection
+    Should Contain    ${output}    Deleted port_pair_group
+    [Return]    ${output}
+
+Create SFC Port Chain
+    [Arguments]    ${name}    ${pg1}    ${pg2}    ${fc}
+    [Documentation]    Creates a port pair chain with two port groups and a singel classifier.
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${cmd}=    Set Variable    neutron port-chain-create --port-pair-group ${pg1} --port-pair-group ${pg2} --flow-classifier ${fc} ${name}
+    Log    ${cmd}
+    ${output}=    Write Commands Until Prompt    ${cmd}    30s
+    Log    ${output}
+    Close Connection
+    Should Contain    ${output}    Created a new port_chain
+    [Return]    ${output}
+
+Delete SFC Port Chain
+    [Arguments]    ${name}
+    [Documentation]    Delete a SFC port chain
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${cmd}=    Set Variable    neutron port-chain-delete ${name}
+    Log    ${cmd}
+    ${output}=    Write Commands Until Prompt    ${cmd}    30s
+    Log    ${output}
+    Close Connection
+    Should Contain    ${output}    Deleted port_chain
+    [Return]    ${output}
+
+Reboot Nova VM
+    [Arguments]    ${vm_name}
+    [Documentation]    Reboot NOVA VM
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${output}=    Write Commands Until Prompt    nova reboot --poll ${vm_name}    30s
+    Log    ${output}
+    Wait Until Keyword Succeeds    35s    10s    Verify VM Is ACTIVE    ${vm_name}
+    Close Connection
+
+Remove RSA Key From KnowHosts
+    [Arguments]    ${vm_ip}
+    [Documentation]    Remove RSA
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${output}=    Write Commands Until Prompt    sudo cat /root/.ssh/known_hosts    30s
+    Log    ${output}
+    ${output}=    Write Commands Until Prompt    sudo ssh-keygen -f "/root/.ssh/known_hosts" -R ${vm_ip}    30s
+    Log    ${output}
+    ${output}=    Write Commands Until Prompt    sudo cat "/root/.ssh/known_hosts"    30s
+    Log    ${output}
+    Close Connection