d8c7a7305cf65b0eb99d01d367c73c45ea873053
[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 = "planetlab2.ionio.gr"
41         self.host2 = "planetlab2.cs.aueb.gr"
42         self.user = "inria_nepi"
43
44     @skipIfAnyNotAlive
45     def t_ovs(self, user1, switch1, user2, switch2, user3, host1, user4, host2):
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.register_connection(port1, ovs1)
65
66         port2 = ec.register_resource("planetlab::OVSPort")
67         ec.set(port2, "port_name", "port-2")
68         ec.register_connection(port2, ovs1)
69
70         node2 = ec.register_resource("planetlab::PlanetlabNode")
71         ec.set(node2, "hostname", switch2)
72         ec.set(node2, "username", user2)
73         ec.set(node2, "cleanExperiment", True)
74         ec.set(node2, "cleanProcesses", True) 
75
76         ovs2 = ec.register_resource("planetlab::OVSSwitch")
77         ec.set(ovs2, "bridge_name", "nepi_bridge")
78         ec.set(ovs2, "virtual_ip_pref", "192.168.3.2/24")
79         ec.set(ovs2, "controller_ip", "85.23.168.77")
80         ec.set(ovs2, "controller_port", "6633")
81         ec.register_connection(ovs2, node2)
82
83         port3 = ec.register_resource("planetlab::OVSPort")
84         ec.set(port3, "port_name", "port-3")
85         ec.register_connection(port3, ovs2)  
86
87         port4 = ec.register_resource("planetlab::OVSPort")
88         ec.set(port4, "port_name", "port-4")
89         ec.register_connection(port4, ovs2)
90
91         node3 = ec.register_resource("planetlab::Node")
92         ec.set(node3, "hostname", host1)
93         ec.set(node3, "username", user3)
94         ec.set(node3, "cleanExperiment", True)
95         ec.set(node3, "cleanProcesses", True)
96
97         tap1 = ec.register_resource("planetlab::Tap")
98         ec.set(tap1, "ip4", "192.168.3.3")
99         ec.set(tap1, "pointopoint", "192.168.3.1")
100         ec.set(tap1, "prefix4", 24)
101         ec.register_connection(tap1, node3)
102
103         node4 = ec.register_resource("planetlab::Node")
104         ec.set(node4, "hostname", host2)
105         ec.set(node4, "username", user4)
106         ec.set(node4, "cleanExperiment", True)
107         ec.set(node4, "cleanProcesses", True)
108
109         tap2 = ec.register_resource("planetlab::Tap")
110         ec.set(tap2, "ip4", "192.168.3.4")
111         ec.set(tap2, "pointopoint", "192.168.3.2")
112         ec.set(tap2, "prefix4", 24)
113         ec.register_connection(tap2, node4)
114
115         ovstun1 = ec.register_resource("planetlab::OVSTunnel")
116         ec.register_connection(port1, ovstun1)
117         ec.register_connection(tap1, ovstun1)
118
119         ovstun2 = ec.register_resource("plantelab::OVSTunnel")
120         ec.register_connection(port3, ovstun2)
121         ec.register_connection(tap2, ovstun2)
122
123         ovstun3 = ec.register_resource("planetlab::OVSTunnel")
124         ec.register_connection(port2, ovstun3)
125         ec.register_connection(port4, ovstun3)
126
127         app1 = ec.register_resource("linux::Application")
128         cmd = "ping -c3 192.168.3.2"
129         ec.set(app1, "command", cmd)
130         ec.register_connection(app1, node1)
131
132         app2 = ec.register_resource("linux::Application")
133         cmd = "ping -c3 192.168.3.4"
134         ec.set(app2, "command", cmd)
135         ec.register_connection(app2, node2)
136
137         ec.deploy()
138
139         ec.wait_finished(app2)
140         
141         if_name = ec.get(tap1, "deviceName")
142         self.assertTrue(if_name.startswith("tap"))
143         
144         if_name = ec.get(tap2, "deviceName")
145         self.assertTrue(if_name.startswith("tap"))
146
147         ping1 = ec.trace(app1, 'stdout')
148         expected1 = """3 packets transmitted, 3 received, 0% packet loss"""
149         self.assertTrue(ping1.find(expected1) > -1)
150
151         ping2 = ec.trace(app2, 'stdout')
152         expected2 = """3 packets transmitted, 3 received, 0% packet loss"""
153         self.assertTrue(ping2.find(expected2) > -1)
154
155         ec.shutdown()
156
157     def test_ovs(self):
158         self.t_ovs(self.user, self.switch1, self.user, self.switch2, self.user, self.host1, self.user, self.host2)
159
160 if __name__ == '__main__':
161     unittest.main()
162