c52960e44d8a818f10828dd8752b14523e9bace1
[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 as published by
8 #    the Free Software Foundation, either version 3 of the License, or
9 #    (at your option) any later version.
10 #
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.
15 #
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/>.
18 #
19 # Author: Alina Quereilhac <alina.quereilhac@inria.fr>
20 #         Alexandros Kouvakas <alexandros.kouvakas@gmail.com>
21
22 #         Switch1 ------- Switch2         
23 #            /                \           
24 #           /                  \          
25 #          /                    \         
26 #       Host1                  Host2      
27
28 from nepi.execution.ec import ExperimentController 
29
30 from test_utils import skipIfAnyNotAlive
31
32 import os
33 import time
34 import unittest
35
36 class OvsTestCase(unittest.TestCase):
37     def setUp(self):
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"
43
44     @skipIfAnyNotAlive
45     def t_ovs(self, user1, switch1, user2, switch2, user3, host1, user4, host2):
46         network = "192.168.3.0"
47
48         ec = ExperimentController(exp_id = "test-ovs")
49         
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)  
55
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)
62
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)
67
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)
72
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) 
78
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)
85
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)  
90
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)
95
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)
101
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)
107
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)
113
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)
119
120         ovstun1 = ec.register_resource("linux::UdpTunnel")
121         ec.register_connection(port1, ovstun1)
122         ec.register_connection(tap1, ovstun1)
123
124         ovstun2 = ec.register_resource("linux::UdpTunnel")
125         ec.register_connection(port3, ovstun2)
126         ec.register_connection(tap2, ovstun2)
127
128         ovstun3 = ec.register_resource("linux::UdpTunnel")
129         ec.register_connection(port2, ovstun3)
130         ec.register_connection(port4, ovstun3)
131
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)
136
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)
141
142         ec.deploy()
143
144         ec.wait_finished(app2)
145         
146         if_name = ec.get(tap1, "deviceName")
147         self.assertTrue(if_name.startswith("tap"))
148         
149         if_name = ec.get(tap2, "deviceName")
150         self.assertTrue(if_name.startswith("tap"))
151
152         ping1 = ec.trace(app1, 'stdout')
153         expected1 = """3 packets transmitted, 3 received, 0% packet loss"""
154         self.assertTrue(ping1.find(expected1) > -1)
155
156         ping2 = ec.trace(app2, 'stdout')
157         expected2 = """3 packets transmitted, 3 received, 0% packet loss"""
158         self.assertTrue(ping2.find(expected2) > -1)
159
160         ec.shutdown()
161
162     def test_ovs(self):
163         self.t_ovs(self.user, self.switch1, self.user, self.switch2, self.user, self.host1, self.user, self.host2)
164
165 if __name__ == '__main__':
166     unittest.main()
167