4 Vhosts setup test 51/1051/33
authorZdeno Olsovsky <zolsovsk@cisco.com>
Tue, 10 May 2016 13:08:07 +0000 (15:08 +0200)
committerJan Gelety <jgelety@cisco.com>
Tue, 7 Jun 2016 19:28:45 +0000 (19:28 +0000)
-JIRA: CSIT-64

Change-Id: I0d6fc522f3214d1b4887e65d5639a323efdf7dd7
Signed-off-by: Zdeno Olsovsky <zolsovsk@cisco.com>
resources/libraries/bash/dut_setup.sh
resources/libraries/python/IPv4Util.py
resources/libraries/python/L2Util.py
resources/libraries/robot/double_qemu_setup.robot [new file with mode: 0644]
resources/libraries/robot/vxlan.robot
resources/templates/vat/l2_tag_rewrite.vat
tests/suites/fds_related_tests/provider_network.robot [new file with mode: 0644]
tests/suites/fds_related_tests/tenant_network.robot [new file with mode: 0644]

index a5ca415..8d91bc9 100644 (file)
@@ -49,3 +49,5 @@ cmd 'tail -n 50 /var/log/syslog'
 echo "[Command_desc] Adding dpdk-input trace"
 cmd 'sudo vpp_api_test <<< "exec trace add dpdk-input 100"'
 
+echo "[Command_desc] Adding vhost-user-input trace"
+cmd 'sudo vpp_api_test <<< "exec trace add vhost-user-input 100"'
index 5ee73c0..4fe711f 100644 (file)
@@ -18,6 +18,7 @@ from robot.api.deco import keyword
 
 from resources.libraries.python.topology import Topology
 from resources.libraries.python.IPv4Setup import get_node
+from resources.libraries.python.ssh import exec_cmd
 
 
 class IPv4Util(object):
@@ -160,3 +161,29 @@ class IPv4Util(object):
         if net is None:
             raise ValueError('Link "{0}" not found'.format(link))
         return net.get('prefix')
+
+    @staticmethod
+    def send_ping_from_node_to_dst(node, destination, namespace=None,
+                                   ping_count=3):
+        """Send a ping from node to destination. Optionally, you can define a
+        namespace from where to send a ping.
+
+        :param node: Node to start ping on.
+        :param destination: IPv4 address where to send ping.
+        :param namespace: Namespace to send ping from.
+        :param ping_count: Number of pings to send.
+        :type node: dict
+        :type destination: str
+        :type namespace: str
+        :type ping_count: int
+        :raises RuntimeError: If no response for ping, raise error
+        """
+        cmd = ''
+        if namespace is not None:
+            cmd = 'ip netns exec {0} ping -c{1} {2}'.format(
+                namespace, ping_count, destination)
+        else:
+            cmd = 'ping -c{0} {1}'.format(ping_count, destination)
+        rc, stdout, stderr = exec_cmd(node, cmd, sudo=True)
+        if rc != 0:
+            raise RuntimeError("Ping Not Successful")
index 5903d03..e44a6b3 100644 (file)
@@ -21,7 +21,7 @@ from resources.libraries.python.ssh import exec_cmd_no_error
 
 
 class L2Util(object):
-    """Utilities for l2 configuration"""
+    """Utilities for l2 configuration."""
 
     @staticmethod
     def vpp_add_l2fib_entry(node, mac, interface, bd_id):
@@ -203,6 +203,7 @@ class L2Util(object):
         :type br_name: str
         :type if_1: str
         :type if_2: str
+
         """
         cmd = 'brctl addbr {0}'.format(br_name)
         exec_cmd_no_error(node, cmd, sudo=True)
@@ -211,13 +212,42 @@ class L2Util(object):
         cmd = 'brctl addif {0} {1}'.format(br_name, if_2)
         exec_cmd_no_error(node, cmd, sudo=True)
 
+    @staticmethod
+    def setup_network_namespace(node, namespace_name, interface_name,
+                                ip_address, prefix):
+        """Setup namespace on given node and attach interface and IP to
+        this namespace. Applicable also on TG node.
+
+        :param node: Node to set namespace on.
+        :param namespace_name: Namespace name.
+        :param interface_name: Interface name.
+        :param ip_address: IP address of namespace's interface.
+        :param prefix: IP address prefix length.
+        :type node: dict
+        :type namespace_name: str
+        :type vhost_if: str
+        :type ip_address: str
+        :type prefix: int
+
+        """
+        cmd = ('ip netns add {0}'.format(namespace_name))
+        exec_cmd_no_error(node, cmd, sudo=True)
+
+        cmd = ('ip link set dev {0} up netns {1}'.format(interface_name,
+                                                         namespace_name))
+        exec_cmd_no_error(node, cmd, sudo=True)
+
+        cmd = ('ip netns exec {0} ip addr add {1}/{2} dev {3}'.format(
+            namespace_name, ip_address, prefix, interface_name))
+        exec_cmd_no_error(node, cmd, sudo=True)
+
     @staticmethod
     def linux_del_bridge(node, br_name):
         """Delete bridge from linux node.
 
         :param node: Node to delete bridge from.
         :param br_name: Bridge name.
-        .. note:: The network interface corresponding to the bridge must be
+        ..note:: The network interface corresponding to the bridge must be
         down before it can be deleted!
         """
         cmd = 'brctl delbr {0}'.format(br_name)
@@ -250,17 +280,22 @@ class L2Util(object):
         return data
 
     @staticmethod
-    def l2_tag_rewrite(node, interface, tag_rewrite_method):
+    def l2_tag_rewrite(node, interface, tag_rewrite_method, tag1_id=None):
         """Rewrite tags in frame.
 
         :param node: Node to rewrite tags.
         :param interface: Interface on which rewrite tags.
         :param tag_rewrite_method: Method of tag rewrite.
+        :param tag1_id: Optional tag1 ID for VLAN.
         :type node: dict
         :type interface: str or int
         :type tag_rewrite_method : str
+        :type tag1_id: int
         """
-
+        if tag1_id is None:
+            tag1_id = ''
+        else:
+            tag1_id = 'tag1 {0}'.format(tag1_id)
         if isinstance(interface, basestring):
             sw_if_index = Topology.get_interface_sw_index(node, interface)
         else:
@@ -270,4 +305,5 @@ class L2Util(object):
             vat.vat_terminal_exec_cmd_from_template("l2_tag_rewrite.vat",
                                                     sw_if_index=sw_if_index,
                                                     tag_rewrite_method=
-                                                    tag_rewrite_method)
+                                                    tag_rewrite_method,
+                                                    tag1_optional=tag1_id)
diff --git a/resources/libraries/robot/double_qemu_setup.robot b/resources/libraries/robot/double_qemu_setup.robot
new file mode 100644 (file)
index 0000000..167605e
--- /dev/null
@@ -0,0 +1,99 @@
+# Copyright (c) 2016 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Keywords ***
+| Setup QEMU Vhost and Run
+| | [Documentation] | Setup Qemu with 4 vhost-user interfaces and 4 namespaces.
+| | ...             | Each call will be different object instance.
+| | ...
+| | ... | *Arguments:*
+| | ... | - dut_node - Node where to setup qemu. Type: dict
+| | ... | - sock1 - Socket path for first Vhost-User interface. Type: string
+| | ... | - sock2 - Socket path for second Vhost-User interface. Type: string
+| | ... | - sock3 - Socket path for third Vhost-User interface. Type: string
+| | ... | - sock4 - Socket path for forth Vhost-User interface. Type: string
+| | ... | - ip1 - IP address for namespace 1. Type: string
+| | ... | - ip2 - IP address for namespace 2. Type: string
+| | ... | - ip3 - IP address for namespace 3. Type: string
+| | ... | - ip4 - IP address for namespace 4. Type: string
+| | ... | - prefix_length - IP prefix length. Type: int
+| | ... | - qemu_name - Qemu instance name by which the object will be accessed.
+| | ... |               Type: string
+| | ... | - mac_ID - MAC address ID used to differentiate qemu instances and
+| | ... | namespaces assigned to them. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Setup QEMU Vhost And Run\| {nodes['DUT1']} \| /tmp/sock1 \
+| | ... | \| /tmp/sock2 \| /tmp/sock3 \| /tmp/sock4 \| 16.0.0.1 \| 16.0.0.2 \
+| | ... | \| 16.0.0.3 \| 16.0.0.4 \| 24 \| qemu_instance_1 \| 06 \|
+| | ...
+| | [Arguments] | ${dut_node} | ${sock1} | ${sock2} | ${sock3} | ${sock4}
+| | ... | ${ip1} | ${ip2} | ${ip3} | ${ip4} | ${prefix_length}
+| | ... | ${qemu_name} | ${mac_ID}
+| | Import Library | resources.libraries.python.QemuUtils \
+| | ... | WITH NAME | ${qemu_name}
+| | ${qemu_add_vhost}= | Replace Variables | ${qemu_name}.Qemu Add Vhost User If
+| | ${qemu_set_node}= | Replace Variables | ${qemu_name}.Qemu Set Node
+| | ${qemu_start}= | Replace Variables | ${qemu_name}.Qemu Start
+| | Run keyword | ${qemu_add_vhost} | ${sock1} | mac=52:54:00:00:${mac_ID}:01
+| | Run keyword | ${qemu_add_vhost} | ${sock2} | mac=52:54:00:00:${mac_ID}:02
+| | Run keyword | ${qemu_add_vhost} | ${sock3} | mac=52:54:00:00:${mac_ID}:03
+| | Run keyword | ${qemu_add_vhost} | ${sock4} | mac=52:54:00:00:${mac_ID}:04
+| | Run keyword | ${qemu_set_node} | ${dut_node}
+| | ${vm}= | Run keyword | ${qemu_start}
+| | ${vhost1}= | Get Vhost User If Name By Sock | ${vm} | ${sock1}
+| | ${vhost2}= | Get Vhost User If Name By Sock | ${vm} | ${sock2}
+| | ${vhost3}= | Get Vhost User If Name By Sock | ${vm} | ${sock3}
+| | ${vhost4}= | Get Vhost User If Name By Sock | ${vm} | ${sock4}
+| | Set Interface State | ${vm} | ${vhost1} | up
+| | Set Interface State | ${vm} | ${vhost2} | up
+| | Set Interface State | ${vm} | ${vhost3} | up
+| | Set Interface State | ${vm} | ${vhost4} | up
+| | Setup Network Namespace
+| | ... | ${vm} | nmspace1 | ${vhost1} | ${ip1} | ${prefix_length}
+| | Setup Network Namespace
+| | ... | ${vm} | nmspace2 | ${vhost2} | ${ip2} | ${prefix_length}
+| | Setup Network Namespace
+| | ... | ${vm} | nmspace3 | ${vhost3} | ${ip3} | ${prefix_length}
+| | Setup Network Namespace
+| | ... | ${vm} | nmspace4 | ${vhost4} | ${ip4} | ${prefix_length}
+| | Set Test Variable | ${${qemu_name}} | ${vm}
+
+| Qemu Teardown
+| | [Documentation] | Stop specific qemu instance
+| | ...             | running on ${dut_node}, ${vm} is VM node info dictionary
+| | ...             | returned by qemu_start or None.
+| | ... | *Arguments:*
+| | ... | - dut_node - Node where to clean qemu. Type: dict
+| | ... | - vm - VM node info dictionary. Type: string
+| | ... | - qemu_name - Qemu instance by name. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Qemu Teardown \| ${node['DUT1']} \| ${vm} \| qemu_node_1 \|
+| | ...
+| | [Arguments] | ${dut_node} | ${vm} | ${qemu_name}
+| | ${set_node}= | Replace Variables | ${qemu_name}.Qemu Set Node
+| | ${sys_status}= | Replace Variables | ${qemu_name}.Qemu System Status
+| | ${kill}= | Replace Variables | ${qemu_name}.Qemu Kill
+| | ${sys_pd}= | Replace Variables | ${qemu_name}.Qemu System Powerdown
+| | ${quit}= | Replace Variables | ${qemu_name}.Qemu Quit
+| | ${clear_socks}= | Replace Variables | ${qemu_name}.Qemu Clear Socks
+| | Run Keyword | ${set_node} | ${dut_node}
+| | ${status} | ${value}= | Run Keyword And Ignore Error | ${sys_status}
+| | Run Keyword If | "${status}" == "FAIL" | ${kill}
+| | ... | ELSE IF | "${value}" == "running" | ${sys_pd}
+| | ... | ELSE | ${quit}
+| | Run Keyword | ${clear_socks}
+| | Run Keyword If | ${vm} is not None | Disconnect | ${vm}
index e3d5f35..7b97769 100644 (file)
@@ -62,7 +62,7 @@
 
 | Interfaces are added to xconnect
 | | [Arguments] | ${DUT} | ${INTERFACE_1} | ${INTERFACE_2}
-| |  L2 setup xconnect on DUT | ${DUT} | ${INTERFACE_1} | ${INTERFACE_2}
+| | L2 setup xconnect on DUT | ${DUT} | ${INTERFACE_1} | ${INTERFACE_2}
 
 | Vlan interfaces for VXLAN are created
 | | [Documentation] | *Create VLAN subinterface on interfaces on DUTs with given VLAN ID.*
index efc6e3b..acb4baa 100644 (file)
@@ -1 +1 @@
-l2_interface_vlan_tag_rewrite sw_if_index {sw_if_index} {tag_rewrite_method}
+l2_interface_vlan_tag_rewrite sw_if_index {sw_if_index} {tag_rewrite_method} {tag1_optional}
diff --git a/tests/suites/fds_related_tests/provider_network.robot b/tests/suites/fds_related_tests/provider_network.robot
new file mode 100644 (file)
index 0000000..eb7ed2c
--- /dev/null
@@ -0,0 +1,335 @@
+# Copyright (c) 2016 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/default.robot
+| Resource | resources/libraries/robot/ipv4.robot
+| Resource | resources/libraries/robot/bridge_domain.robot
+| Resource | resources/libraries/robot/testing_path.robot
+| Resource | resources/libraries/robot/double_qemu_setup.robot
+| Resource | resources/libraries/robot/qemu.robot
+| Library  | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV
+| Test Setup | Run Keywords | Setup all DUTs before test
+| ...        | AND          | Setup all TGs before traffic script
+| Test Teardown | Run Keywords | Show Packet Trace on All DUTs | ${nodes}
+| ...          | AND | Qemu Teardown | ${dut1_node} | ${qemu_node1} | qemu_node1
+| ...          | AND | Qemu Teardown | ${dut2_node} | ${qemu_node2} | qemu_node2
+| Documentation | *Provider network FDS related.*
+| ...
+| ... | Test suite uses 3-node topology TG - DUT1 - DUT2 - TG
+| ... | with one link between nodes. Test packets are sent in both directions
+| ... | between namespaces in DUT1 and DUT2 with both positive and negative
+| ... | scenarios tested.
+
+*** Variables ***
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+| ${shg1}= | 3
+| ${shg2}= | 4
+| ${sock1}= | /tmp/sock1
+| ${sock2}= | /tmp/sock2
+| ${sock3}= | /tmp/sock3
+| ${sock4}= | /tmp/sock4
+
+| ${bid_b}= | 23
+| ${bid_r}= | 24
+
+| ${vlan_red}= | 50
+| ${vlan_blue}= | 60
+
+| ${dut1_if_ip}= | 16.0.0.1
+| ${dut2_if_ip}= | 16.0.0.2
+
+| ${dut1_blue1}= | 16.0.10.1
+| ${dut1_blue2}= | 16.0.10.2
+| ${dut1_red1}= | 16.0.10.3
+| ${dut1_red2}= | 16.0.10.4
+
+| ${dut2_blue1}= | 16.0.20.1
+| ${dut2_blue2}= | 16.0.20.2
+| ${dut2_red1}= | 16.0.20.3
+| ${dut2_red2}= | 16.0.20.4
+
+| ${namespace1}= | nmspace1
+| ${namespace2}= | nmspace2
+| ${namespace3}= | nmspace3
+| ${namespace4}= | nmspace4
+
+| ${prefix_length}= | 16
+
+*** Test Cases ***
+| Provider network test cases with provider physical networks (VLAN)
+| | [Documentation] | Ping among all ports inside the same network should pass.
+| | ...             | a) test l2 connectivity inside every network
+| | ...             | b) test l2 connectivity between networks
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO | VPP_VM_ENV
+| | Given Path for 3-node testing is set | ${nodes['TG']} | ${nodes['DUT1']}
+| | ... | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set Interface Address | ${dut1_node} | ${dut1_to_dut2} | ${dut1_if_ip}
+| | ... | ${prefix_length}
+| | And Set Interface Address | ${dut2_node} | ${dut2_to_dut1} | ${dut2_if_ip}
+| | ... | ${prefix_length}
+| | And Set Interface State | ${dut1_node} | ${dut1_to_dut2} | up
+| | And Set Interface State | ${dut2_node} | ${dut2_to_dut1} | up
+| | ${vhost_if1_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock1}
+| | ${vhost_if2_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock2}
+| | ${vhost_if3_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock3}
+| | ${vhost_if4_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock4}
+| | ${dut1_vhosts}= | And Create List | ${vhost_if1_DUT1} | ${vhost_if2_DUT1}
+| | ... | ${vhost_if3_DUT1} | ${vhost_if4_DUT1}
+| | ${vhost_if1_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock1}
+| | ${vhost_if2_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock2}
+| | ${vhost_if3_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock3}
+| | ${vhost_if4_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock4}
+| | ${dut2_vhosts}= | And Create List | ${vhost_if1_DUT2} | ${vhost_if2_DUT2}
+| | ... | ${vhost_if3_DUT2} | ${vhost_if4_DUT2}
+| | When Setup QEMU Vhost and Run | ${dut1_node}
+| | ...                   | ${sock1}
+| | ...                   | ${sock2}
+| | ...                   | ${sock3}
+| | ...                   | ${sock4}
+| | ...                   | ${dut1_blue1}
+| | ...                   | ${dut1_blue2}
+| | ...                   | ${dut1_red1}
+| | ...                   | ${dut1_red2}
+| | ...                   | ${prefix_length}
+| | ...                   | qemu_node1
+| | ...                   | 04
+| | And Setup QEMU Vhost and Run | ${dut2_node}
+| | ...                   | ${sock1}
+| | ...                   | ${sock2}
+| | ...                   | ${sock3}
+| | ...                   | ${sock4}
+| | ...                   | ${dut2_blue1}
+| | ...                   | ${dut2_blue2}
+| | ...                   | ${dut2_red1}
+| | ...                   | ${dut2_red2}
+| | ...                   | ${prefix_length}
+| | ...                   | qemu_node2
+| | ...                   | 06
+| | And Setup VLAN and BD on Dut | ${dut1_node} | ${dut1_to_dut2}
+| | ... | @{dut1_vhosts}
+| | And Setup VLAN and BD on Dut | ${dut2_node} | ${dut2_to_dut1}
+| | ... | @{dut2_vhosts}
+| | Then Positive Scenario Ping From DUT1 - Intra network
+| | And Positive Scenario Ping From DUT1 - Inter network
+| | And Positive Scenario Ping From DUT2 - Intra network
+| | And Positive Scenario Ping From DUT2 - Inter network
+| | And Negative Scenario Ping From DUT1 - Intra network
+| | And Negative Scenario Ping From DUT1 - Inter network
+| | And Negative Scenario Ping From DUT2 - Intra network
+| | And Negative Scenario Ping From DUT2 - Inter network
+
+*** Keywords ***
+| Setup VLAN and BD on Dut
+| | [Documentation] | Setup VLAN and bridge domain on specific DUT and
+| | ...             | subsequently interconnect them properly. Also set VLAN tag
+| | ...             | rewrite on vhosts.
+| | ...
+| | ... | *Arguments:*
+| | ... | - dut_node - Node where to setup VLAN and BD. Type: dict
+| | ... | - interface - Interface where to create VLAN sub-interface.
+| | ... |               Type: string
+| | ... | - vhosts - List containing vhost interfaces.
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Setup VLAN and BD on Dut \| ${dut_node} \| GigabitEthernet0/6/0 \
+| | ... | \| @{vhosts} \|
+| | ...
+| | [Arguments] | ${dut_node} | ${interface} | @{vhosts}
+| | Bridge domain on DUT node is created | ${dut_node} | ${bid_b} | learn=${TRUE}
+| | Bridge domain on DUT node is created | ${dut_node} | ${bid_r} | learn=${TRUE}
+| | ${vlan1_name} | ${vlan1_index}= | Create Vlan Subinterface
+| | ... | ${dut_node} | ${interface} | ${vlan_blue}
+| | ${vlan2_name} | ${vlan2_index}= | Create Vlan Subinterface
+| | ... | ${dut_node} | ${interface} | ${vlan_red}
+| | L2 Tag Rewrite | ${dut_node} | @{vhosts}[0] | push-1 | ${vlan_blue}
+| | L2 Tag Rewrite | ${dut_node} | @{vhosts}[1] | push-1 | ${vlan_blue}
+| | L2 Tag Rewrite | ${dut_node} | @{vhosts}[2] | push-1 | ${vlan_red}
+| | L2 Tag Rewrite | ${dut_node} | @{vhosts}[3] | push-1 | ${vlan_red}
+| | Interface is added to bridge domain | ${dut_node}
+| | ... | ${vlan1_index} | ${bid_b} | 0
+| | Interface is added to bridge domain | ${dut_node}
+| | ... | @{vhosts}[0] | ${bid_b} | 0
+| | Interface is added to bridge domain | ${dut_node}
+| | ... | @{vhosts}[1] | ${bid_b} | 0
+| | Interface is added to bridge domain | ${dut_node}
+| | ... | ${vlan2_index} | ${bid_r} | 0
+| | Interface is added to bridge domain | ${dut_node}
+| | ... | @{vhosts}[2] | ${bid_r} | 0
+| | Interface is added to bridge domain | ${dut_node}
+| | ... | @{vhosts}[3] | ${bid_r} | 0
+
+| Positive Scenario Ping From DUT1 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red1} | ${namespace4}
+
+| Positive Scenario Ping From DUT1 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1} | ${namespace4}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2} | ${namespace4}
+
+| Positive Scenario Ping From DUT2 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red1} | ${namespace4}
+
+| Positive Scenario Ping From DUT2 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1} | ${namespace4}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2} | ${namespace4}
+
+| Negative Scenario Ping From DUT1 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue2}
+| | ... | ${namespace4}
+
+
+| Negative Scenario Ping From DUT1 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2}
+| | ... | ${namespace4}
+
+| Negative Scenario Ping From DUT2 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue2}
+| | ... | ${namespace4}
+
+
+| Negative Scenario Ping From DUT2 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2}
+| | ... | ${namespace4}
\ No newline at end of file
diff --git a/tests/suites/fds_related_tests/tenant_network.robot b/tests/suites/fds_related_tests/tenant_network.robot
new file mode 100644 (file)
index 0000000..361ffe4
--- /dev/null
@@ -0,0 +1,332 @@
+# Copyright (c) 2016 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/default.robot
+| Resource | resources/libraries/robot/ipv4.robot
+| Resource | resources/libraries/robot/bridge_domain.robot
+| Resource | resources/libraries/robot/testing_path.robot
+| Resource | resources/libraries/robot/double_qemu_setup.robot
+| Resource | resources/libraries/robot/qemu.robot
+| Library  | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV
+| Test Setup | Run Keywords | Setup all DUTs before test
+| ...        | AND          | Setup all TGs before traffic script
+| Test Teardown | Run Keywords | Show Packet Trace on All DUTs | ${nodes}
+| ...          | AND | Qemu Teardown | ${dut1_node} | ${qemu_node1} | qemu_node1
+| ...          | AND | Qemu Teardown | ${dut2_node} | ${qemu_node2} | qemu_node2
+| Documentation | *Tenant network FDS related.*
+| ...
+| ... | Test suite uses 3-node topology TG - DUT1 - DUT2 - TG
+| ... | with one link between nodes. Test packets are sent in both directions
+| ... | between namespaces in DUT1 and DUT2 with both positive and negative
+| ... | scenarios tested.
+
+*** Variables ***
+| ${bd_id1}= | 1
+| ${bd_id2}= | 2
+| ${shg1}= | 3
+| ${shg2}= | 4
+| ${sock1}= | /tmp/sock1
+| ${sock2}= | /tmp/sock2
+| ${sock3}= | /tmp/sock3
+| ${sock4}= | /tmp/sock4
+
+| ${vni_blue}= | 23
+| ${vni_red}= | 24
+
+| ${bid_b}= | 23
+| ${bid_r}= | 24
+
+| ${dut1_if_ip}= | 16.0.0.1
+| ${dut2_if_ip}= | 16.0.0.2
+
+| ${dut1_blue1}= | 16.0.10.1
+| ${dut1_blue2}= | 16.0.10.2
+| ${dut1_red1}= | 16.0.10.3
+| ${dut1_red2}= | 16.0.10.4
+
+| ${dut2_blue1}= | 16.0.20.1
+| ${dut2_blue2}= | 16.0.20.2
+| ${dut2_red1}= | 16.0.20.3
+| ${dut2_red2}= | 16.0.20.4
+
+| ${namespace1}= | nmspace1
+| ${namespace2}= | nmspace2
+| ${namespace3}= | nmspace3
+| ${namespace4}= | nmspace4
+
+| ${prefix_length}= | 16
+
+*** Test Cases ***
+| L2 test cases with tenant networks (VXLAN)
+| | [Documentation] | Ping among all ports inside the same network should pass.
+| | ...             | a) test l2 connectivity inside every network
+| | ...             | b) test l2 connectivity between networks
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO | VPP_VM_ENV
+| | Given Path for 3-node testing is set
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
+| | And Set Interface Address
+| | ... | ${dut1_node} | ${dut1_to_dut2} | ${dut1_if_ip} | ${prefix_length}
+| | And Set Interface Address
+| | ... | ${dut2_node} | ${dut2_to_dut1} | ${dut2_if_ip} | ${prefix_length}
+| | And Set Interface State | ${dut1_node} | ${dut1_to_dut2} | up
+| | And Set Interface State | ${dut2_node} | ${dut2_to_dut1} | up
+| | ${vhost_if1_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock1}
+| | ${vhost_if2_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock2}
+| | ${vhost_if3_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock3}
+| | ${vhost_if4_DUT1}= | And Vpp Create Vhost User Interface
+| | ... | ${dut1_node} | ${sock4}
+| | ${dut1_vhosts}= | And Create List | ${vhost_if1_DUT1} | ${vhost_if2_DUT1}
+| | ... | ${vhost_if3_DUT1} | ${vhost_if4_DUT1}
+| | ${vhost_if1_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock1}
+| | ${vhost_if2_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock2}
+| | ${vhost_if3_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock3}
+| | ${vhost_if4_DUT2}= | And Vpp Create Vhost User Interface
+| | ... | ${dut2_node} | ${sock4}
+| | ${dut2_vhosts}= | And Create List | ${vhost_if1_DUT2} | ${vhost_if2_DUT2}
+| | ... | ${vhost_if3_DUT2} | ${vhost_if4_DUT2}
+| | When Setup QEMU Vhost and Run | ${dut1_node}
+| | ...                   | ${sock1}
+| | ...                   | ${sock2}
+| | ...                   | ${sock3}
+| | ...                   | ${sock4}
+| | ...                   | ${dut1_blue1}
+| | ...                   | ${dut1_blue2}
+| | ...                   | ${dut1_red1}
+| | ...                   | ${dut1_red2}
+| | ...                   | ${prefix_length}
+| | ...                   | qemu_node1
+| | ...                   | 04
+| | And Setup QEMU Vhost and Run | ${dut2_node}
+| | ...                   | ${sock1}
+| | ...                   | ${sock2}
+| | ...                   | ${sock3}
+| | ...                   | ${sock4}
+| | ...                   | ${dut2_blue1}
+| | ...                   | ${dut2_blue2}
+| | ...                   | ${dut2_red1}
+| | ...                   | ${dut2_red2}
+| | ...                   | ${prefix_length}
+| | ...                   | qemu_node2
+| | ...                   | 06
+| | And Setup VXLAN and BD on Dut | ${dut1_node} | ${dut1_if_ip} | ${dut2_if_ip}
+| | ... | @{dut1_vhosts}
+| | And Setup VXLAN and BD on Dut | ${dut2_node} | ${dut2_if_ip} | ${dut1_if_ip}
+| | ... | @{dut2_vhosts}
+| | Then Positive Scenario Ping From DUT1 - Intra network
+| | And Positive Scenario Ping From DUT1 - Inter network
+| | And Positive Scenario Ping From DUT2 - Intra network
+| | And Positive Scenario Ping From DUT2 - Inter network
+| | And Negative Scenario Ping From DUT1 - Intra network
+| | And Negative Scenario Ping From DUT1 - Inter network
+| | And Negative Scenario Ping From DUT2 - Intra network
+| | And Negative Scenario Ping From DUT2 - Inter network
+
+*** Keywords ***
+| Setup VXLAN and BD on Dut
+| | [Documentation] | Setup VXLAN and bridge domain on specific DUT and
+| | ...             | subsequently interconnect them properly.
+| | ...
+| | ... | *Arguments:*
+| | ... | - dut_node - Node where to setup vxlan and BD. Type: dict
+| | ... | - src_ip - Source IP for VXLAN. Type: string
+| | ... | - dst_ip - Destination IP for vxlan. Type: string
+| | ... | - vhosts - List containing vhost interfaces.
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Setup VXLAN and BD on Dut \| ${dut_node} \| 16.0.0.1 \| 16.0.0.1 \
+| | ... | \| @{vhosts} \|
+| | ...
+| | [Arguments] | ${dut_node} | ${src_ip} | ${dst_ip} | @{vhosts}
+| | Bridge domain on DUT node is created
+| | ... | ${dut_node} | ${bid_b} | learn=${TRUE}
+| | Bridge domain on DUT node is created
+| | ... | ${dut_node} | ${bid_r} | learn=${TRUE}
+| | ${vxlan1_if}= | Create VXLAN interface     | ${dut_node} | ${vni_blue}
+| |                 | ...  | ${src_ip} | ${dst_ip}
+| | ${vxlan2_if}= | Create VXLAN interface     | ${dut_node} | ${vni_red}
+| |                 | ...  | ${src_ip} | ${dst_ip}
+| | Interface is added to bridge domain
+| | ... | ${dut_node} | ${vxlan1_if} | ${bid_b} | 0
+| | Interface is added to bridge domain
+| | ... | ${dut_node} | @{vhosts}[0] | ${bid_b} | 0
+| | Interface is added to bridge domain
+| | ... | ${dut_node} | @{vhosts}[1] | ${bid_b} | 0
+| | Interface is added to bridge domain
+| | ... | ${dut_node} | ${vxlan2_if} | ${bid_r} | 0
+| | Interface is added to bridge domain
+| | ... | ${dut_node} | @{vhosts}[2] | ${bid_r} | 0
+| | Interface is added to bridge domain
+| | ... | ${dut_node} | @{vhosts}[3] | ${bid_r} | 0
+
+| Positive Scenario Ping From DUT1 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red1} | ${namespace4}
+
+| Positive Scenario Ping From DUT1 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1} | ${namespace4}
+| | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2} | ${namespace4}
+
+| Positive Scenario Ping From DUT2 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red1} | ${namespace4}
+
+| Positive Scenario Ping From DUT2 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test connectivity.
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2} | ${namespace1}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2} | ${namespace2}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2} | ${namespace3}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1} | ${namespace4}
+| | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2} | ${namespace4}
+
+| Negative Scenario Ping From DUT1 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut1_blue2}
+| | ... | ${namespace4}
+
+
+| Negative Scenario Ping From DUT1 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node1} | ${dut2_blue2}
+| | ... | ${namespace4}
+
+| Negative Scenario Ping From DUT2 - Intra network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut2_blue2}
+| | ... | ${namespace4}
+
+
+| Negative Scenario Ping From DUT2 - Inter network
+| | [Documentation] | Send ping packets from specified namespaces to other in
+| | ...             | order to test unreachability of namespaces.
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2}
+| | ... | ${namespace1}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red1}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_red2}
+| | ... | ${namespace2}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2}
+| | ... | ${namespace3}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue1}
+| | ... | ${namespace4}
+| | Run keyword and expect error | Ping Not Successful
+| | ... | Send Ping From Node To Dst | ${qemu_node2} | ${dut1_blue2}
+| | ... | ${namespace4}

©2016 FD.io a Linux Foundation Collaborative Project. All Rights Reserved.
Linux Foundation is a registered trademark of The Linux Foundation. Linux is a registered trademark of Linus Torvalds.
Please see our privacy policy and terms of use.