3 # NEPI, a framework to manage network experiments
4 # Copyright (C) 2013 INRIA
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 # Author: Alina Quereilhac <alina.quereilhac@inria.fr>
20 # Alexandros Kouvakas <alexandros.kouvakas@gmail.com>
22 # Switch1 ------- Switch2
28 from nepi.execution.ec import ExperimentController
30 from test_utils import skipIfAnyNotAlive
36 class OvsTestCase(unittest.TestCase):
38 self.switch1 = "planetlab2.virtues.fi"
39 self.switch2 = "planetlab2.upc.es"
40 self.host1 = "onelab4.warsaw.rd.tp.pl"
41 self.host2 = "inriarennes1.irisa.fr"
42 self.user = "inria_nepi"
45 def t_ovs(self, user1, switch1, user2, switch2, user3, host1, user4, host2):
46 network = "192.168.3.0"
48 ec = ExperimentController(exp_id = "test-ovs")
50 node1 = ec.register_resource("planetlab::Node")
51 ec.set(node1, "hostname", switch1)
52 ec.set(node1, "username", user1)
53 ec.set(node1, "cleanExperiment", True)
54 ec.set(node1, "cleanProcesses", True)
56 ovs1 = ec.register_resource("planetlab::OVSSwitch")
57 ec.set(ovs1, "bridge_name", "nepi_bridge")
58 ec.set(ovs1, "virtual_ip_pref", "192.168.3.1/24")
59 ec.set(ovs1, "controller_ip", "85.23.168.77")
60 ec.set(ovs1, "controller_port", "6633")
61 ec.register_connection(ovs1, node1)
63 port1 = ec.register_resource("planetlab::OVSPort")
64 ec.set(port1, "port_name", "port-1")
65 ec.set(port1, "network", network)
66 ec.register_connection(port1, ovs1)
68 port2 = ec.register_resource("planetlab::OVSPort")
69 ec.set(port2, "port_name", "port-2")
70 ec.set(port2, "network", network)
71 ec.register_connection(port2, ovs1)
73 node2 = ec.register_resource("planetlab::Node")
74 ec.set(node2, "hostname", switch2)
75 ec.set(node2, "username", user2)
76 ec.set(node2, "cleanExperiment", True)
77 ec.set(node2, "cleanProcesses", True)
79 ovs2 = ec.register_resource("planetlab::OVSSwitch")
80 ec.set(ovs2, "bridge_name", "nepi_bridge")
81 ec.set(ovs2, "virtual_ip_pref", "192.168.3.2/24")
82 ec.set(ovs2, "controller_ip", "85.23.168.77")
83 ec.set(ovs2, "controller_port", "6633")
84 ec.register_connection(ovs2, node2)
86 port3 = ec.register_resource("planetlab::OVSPort")
87 ec.set(port3, "port_name", "port-3")
88 ec.set(port3, "network", network)
89 ec.register_connection(port3, ovs2)
91 port4 = ec.register_resource("planetlab::OVSPort")
92 ec.set(port4, "port_name", "port-4")
93 ec.set(port4, "network", network)
94 ec.register_connection(port4, ovs2)
96 node3 = ec.register_resource("planetlab::Node")
97 ec.set(node3, "hostname", host1)
98 ec.set(node3, "username", user3)
99 ec.set(node3, "cleanExperiment", True)
100 ec.set(node3, "cleanProcesses", True)
102 tap1 = ec.register_resource("planetlab::Tap")
103 ec.set(tap1, "ip", "192.168.3.3")
104 ec.set(tap1, "pointopoint", "192.168.3.1")
105 ec.set(tap1, "prefix", "24")
106 ec.register_connection(tap1, node3)
108 node4 = ec.register_resource("planetlab::Node")
109 ec.set(node4, "hostname", host2)
110 ec.set(node4, "username", user4)
111 ec.set(node4, "cleanExperiment", True)
112 ec.set(node4, "cleanProcesses", True)
114 tap2 = ec.register_resource("planetlab::Tap")
115 ec.set(tap2, "ip", "192.168.3.4")
116 ec.set(tap2, "pointopoint", "192.168.3.2")
117 ec.set(tap2, "prefix", "24")
118 ec.register_connection(tap2, node4)
120 ovstun1 = ec.register_resource("linux::UdpTunnel")
121 ec.register_connection(port1, ovstun1)
122 ec.register_connection(tap1, ovstun1)
124 ovstun2 = ec.register_resource("linux::UdpTunnel")
125 ec.register_connection(port3, ovstun2)
126 ec.register_connection(tap2, ovstun2)
128 ovstun3 = ec.register_resource("linux::UdpTunnel")
129 ec.register_connection(port2, ovstun3)
130 ec.register_connection(port4, ovstun3)
132 app1 = ec.register_resource("linux::Application")
133 cmd = "ping -c3 192.168.3.2"
134 ec.set(app1, "command", cmd)
135 ec.register_connection(app1, node1)
137 app2 = ec.register_resource("linux::Application")
138 cmd = "ping -c3 192.168.3.4"
139 ec.set(app2, "command", cmd)
140 ec.register_connection(app2, node2)
144 ec.wait_finished(app2)
146 if_name = ec.get(tap1, "deviceName")
147 self.assertTrue(if_name.startswith("tap"))
149 if_name = ec.get(tap2, "deviceName")
150 self.assertTrue(if_name.startswith("tap"))
152 ping1 = ec.trace(app1, 'stdout')
153 expected1 = """3 packets transmitted, 3 received, 0% packet loss"""
154 self.assertTrue(ping1.find(expected1) > -1)
156 ping2 = ec.trace(app2, 'stdout')
157 expected2 = """3 packets transmitted, 3 received, 0% packet loss"""
158 self.assertTrue(ping2.find(expected2) > -1)
163 self.t_ovs(self.user, self.switch1, self.user, self.switch2, self.user, self.host1, self.user, self.host2)
165 if __name__ == '__main__':