Fixing wrong license
[nepi.git] / test / resources / planetlab / ovs.py
1 #!/usr/bin/env python
2 #
3 #    NEPI, a framework to manage network experiments
4 #    Copyright (C) 2013 INRIA
5 #
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;
9 #
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.
14 #
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/>.
17 #
18 # Author: Alina Quereilhac <alina.quereilhac@inria.fr>
19 #         Alexandros Kouvakas <alexandros.kouvakas@gmail.com>
20
21 #         Switch1 ------- Switch2         
22 #            /                \           
23 #           /                  \          
24 #          /                    \         
25 #       Host1                  Host2      
26
27 from nepi.execution.ec import ExperimentController 
28
29 from test_utils import skipIfAnyNotAlive
30
31 import os
32 import time
33 import unittest
34
35 class OvsTestCase(unittest.TestCase):
36     def setUp(self):
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"
42
43     @skipIfAnyNotAlive
44     def t_ovs(self, user1, switch1, user2, switch2, user3, host1, user4, host2):
45         network = "192.168.3.0"
46
47         ec = ExperimentController(exp_id = "test-ovs")
48         
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)  
54
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)
61
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)
66
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)
71
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) 
77
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)
84
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)  
89
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)
94
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)
100
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)
106
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)
112
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)
118
119         ovstun1 = ec.register_resource("linux::UdpTunnel")
120         ec.register_connection(port1, ovstun1)
121         ec.register_connection(tap1, ovstun1)
122
123         ovstun2 = ec.register_resource("linux::UdpTunnel")
124         ec.register_connection(port3, ovstun2)
125         ec.register_connection(tap2, ovstun2)
126
127         ovstun3 = ec.register_resource("linux::UdpTunnel")
128         ec.register_connection(port2, ovstun3)
129         ec.register_connection(port4, ovstun3)
130
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)
135
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)
140
141         ec.deploy()
142
143         ec.wait_finished(app2)
144         
145         if_name = ec.get(tap1, "deviceName")
146         self.assertTrue(if_name.startswith("tap"))
147         
148         if_name = ec.get(tap2, "deviceName")
149         self.assertTrue(if_name.startswith("tap"))
150
151         ping1 = ec.trace(app1, 'stdout')
152         expected1 = """3 packets transmitted, 3 received, 0% packet loss"""
153         self.assertTrue(ping1.find(expected1) > -1)
154
155         ping2 = ec.trace(app2, 'stdout')
156         expected2 = """3 packets transmitted, 3 received, 0% packet loss"""
157         self.assertTrue(ping2.find(expected2) > -1)
158
159         ec.shutdown()
160
161     def test_ovs(self):
162         self.t_ovs(self.user, self.switch1, self.user, self.switch2, self.user, self.host1, self.user, self.host2)
163
164 if __name__ == '__main__':
165     unittest.main()
166