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 version 2 as
8 # published by the Free Software Foundation;
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 # Author: Alina Quereilhac <alina.quereilhac@inria.fr>
19 # Alexandros Kouvakas <alexandros.kouvakas@gmail.com>
21 # Switch1 ------- Switch2
27 from nepi.execution.ec import ExperimentController
29 from test_utils import skipIfAnyNotAlive
35 class OvsTestCase(unittest.TestCase):
37 self.switch1 = "planetlab2.virtues.fi"
38 self.switch2 = "planetlab2.upc.es"
39 self.host1 = "onelab4.warsaw.rd.tp.pl"
40 self.host2 = "inriarennes1.irisa.fr"
41 self.user = "inria_nepi"
44 def t_ovs(self, user1, switch1, user2, switch2, user3, host1, user4, host2):
45 network = "192.168.3.0"
47 ec = ExperimentController(exp_id = "test-ovs")
49 node1 = ec.register_resource("planetlab::Node")
50 ec.set(node1, "hostname", switch1)
51 ec.set(node1, "username", user1)
52 ec.set(node1, "cleanExperiment", True)
53 ec.set(node1, "cleanProcesses", True)
55 ovs1 = ec.register_resource("planetlab::OVSSwitch")
56 ec.set(ovs1, "bridge_name", "nepi_bridge")
57 ec.set(ovs1, "virtual_ip_pref", "192.168.3.1/24")
58 ec.set(ovs1, "controller_ip", "85.23.168.77")
59 ec.set(ovs1, "controller_port", "6633")
60 ec.register_connection(ovs1, node1)
62 port1 = ec.register_resource("planetlab::OVSPort")
63 ec.set(port1, "port_name", "port-1")
64 ec.set(port1, "network", network)
65 ec.register_connection(port1, ovs1)
67 port2 = ec.register_resource("planetlab::OVSPort")
68 ec.set(port2, "port_name", "port-2")
69 ec.set(port2, "network", network)
70 ec.register_connection(port2, ovs1)
72 node2 = ec.register_resource("planetlab::Node")
73 ec.set(node2, "hostname", switch2)
74 ec.set(node2, "username", user2)
75 ec.set(node2, "cleanExperiment", True)
76 ec.set(node2, "cleanProcesses", True)
78 ovs2 = ec.register_resource("planetlab::OVSSwitch")
79 ec.set(ovs2, "bridge_name", "nepi_bridge")
80 ec.set(ovs2, "virtual_ip_pref", "192.168.3.2/24")
81 ec.set(ovs2, "controller_ip", "85.23.168.77")
82 ec.set(ovs2, "controller_port", "6633")
83 ec.register_connection(ovs2, node2)
85 port3 = ec.register_resource("planetlab::OVSPort")
86 ec.set(port3, "port_name", "port-3")
87 ec.set(port3, "network", network)
88 ec.register_connection(port3, ovs2)
90 port4 = ec.register_resource("planetlab::OVSPort")
91 ec.set(port4, "port_name", "port-4")
92 ec.set(port4, "network", network)
93 ec.register_connection(port4, ovs2)
95 node3 = ec.register_resource("planetlab::Node")
96 ec.set(node3, "hostname", host1)
97 ec.set(node3, "username", user3)
98 ec.set(node3, "cleanExperiment", True)
99 ec.set(node3, "cleanProcesses", True)
101 tap1 = ec.register_resource("planetlab::Tap")
102 ec.set(tap1, "ip", "192.168.3.3")
103 ec.set(tap1, "pointopoint", "192.168.3.1")
104 ec.set(tap1, "prefix", "24")
105 ec.register_connection(tap1, node3)
107 node4 = ec.register_resource("planetlab::Node")
108 ec.set(node4, "hostname", host2)
109 ec.set(node4, "username", user4)
110 ec.set(node4, "cleanExperiment", True)
111 ec.set(node4, "cleanProcesses", True)
113 tap2 = ec.register_resource("planetlab::Tap")
114 ec.set(tap2, "ip", "192.168.3.4")
115 ec.set(tap2, "pointopoint", "192.168.3.2")
116 ec.set(tap2, "prefix", "24")
117 ec.register_connection(tap2, node4)
119 ovstun1 = ec.register_resource("linux::UdpTunnel")
120 ec.register_connection(port1, ovstun1)
121 ec.register_connection(tap1, ovstun1)
123 ovstun2 = ec.register_resource("linux::UdpTunnel")
124 ec.register_connection(port3, ovstun2)
125 ec.register_connection(tap2, ovstun2)
127 ovstun3 = ec.register_resource("linux::UdpTunnel")
128 ec.register_connection(port2, ovstun3)
129 ec.register_connection(port4, ovstun3)
131 app1 = ec.register_resource("linux::Application")
132 cmd = "ping -c3 192.168.3.2"
133 ec.set(app1, "command", cmd)
134 ec.register_connection(app1, node1)
136 app2 = ec.register_resource("linux::Application")
137 cmd = "ping -c3 192.168.3.4"
138 ec.set(app2, "command", cmd)
139 ec.register_connection(app2, node2)
143 ec.wait_finished(app2)
145 if_name = ec.get(tap1, "deviceName")
146 self.assertTrue(if_name.startswith("tap"))
148 if_name = ec.get(tap2, "deviceName")
149 self.assertTrue(if_name.startswith("tap"))
151 ping1 = ec.trace(app1, 'stdout')
152 expected1 = """3 packets transmitted, 3 received, 0% packet loss"""
153 self.assertTrue(ping1.find(expected1) > -1)
155 ping2 = ec.trace(app2, 'stdout')
156 expected2 = """3 packets transmitted, 3 received, 0% packet loss"""
157 self.assertTrue(ping2.find(expected2) > -1)
162 self.t_ovs(self.user, self.switch1, self.user, self.switch2, self.user, self.host1, self.user, self.host2)
164 if __name__ == '__main__':