Serious refactoring of TUN/TAP and tunnel code. Linux udp/gre tunnels not yet functional
[nepi.git] / test / resources / planetlab / gretunnel.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
21 from nepi.execution.ec import ExperimentController 
22
23 from test_utils import skipIfAnyNotAliveWithIdentity
24
25 import os
26 import time
27 import unittest
28
29 class PlanetLabGRETunnelTestCase(unittest.TestCase):
30     def setUp(self):
31         #self.host1 = "nepi2.pl.sophia.inria.fr"
32         #self.host2 = "nepi5.pl.sophia.inria.fr"
33         self.host1 = "onelab4.warsaw.rd.tp.pl"
34         self.host2 = "inriarennes1.irisa.fr"
35         self.host3 = "roseval.pl.sophia.inria.fr"
36         self.user = "inria_nepi"
37         self.identity = "%s/.ssh/id_rsa_planetlab" % (os.environ['HOME'])
38         #self.netblock = "192.168.1"
39         self.netblock = "192.168.3"
40
41     @skipIfAnyNotAliveWithIdentity
42     def t_tap_gre_tunnel(self, user1, host1, identity1, user2, host2, 
43             identity2):
44
45         ec = ExperimentController(exp_id="test-tap-gre-tunnel")
46         
47         node1 = ec.register_resource("planetlab::Node")
48         ec.set(node1, "hostname", host1)
49         ec.set(node1, "username", user1)
50         ec.set(node1, "identity", identity1)
51         ec.set(node1, "cleanExperiment", True)
52         ec.set(node1, "cleanProcesses", True)
53
54         tap1 = ec.register_resource("planetlab::Tap")
55         ec.set(tap1, "ip", "%s.1" % self.netblock)
56         ec.set(tap1, "prefix", "24")
57         ec.register_connection(tap1, node1)
58
59         node2 = ec.register_resource("planetlab::Node")
60         ec.set(node2, "hostname", host2)
61         ec.set(node2, "username", user2)
62         ec.set(node2, "identity", identity2)
63         ec.set(node2, "cleanExperiment", True)
64         ec.set(node2, "cleanProcesses", True)
65
66         tap2 = ec.register_resource("planetlab::Tap")
67         ec.set(tap2, "ip", "%s.2" % self.netblock)
68         ec.set(tap2, "prefix", "24")
69         ec.register_connection(tap2, node2)
70
71         gretun = ec.register_resource("linux::GRETunnel")
72         ec.register_connection(tap1, gretun)
73         ec.register_connection(tap2, gretun)
74
75         app = ec.register_resource("linux::Application")
76         cmd = "ping -c3 %s.2" % self.netblock
77         ec.set(app, "command", cmd)
78         ec.register_connection(app, node1)
79
80         ec.deploy()
81
82         ec.wait_finished(app)
83
84         ping = ec.trace(app, "stdout")
85         expected = """3 packets transmitted, 3 received, 0% packet loss"""
86         self.assertTrue(ping.find(expected) > -1)
87         
88         if_name = ec.get(tap1, "deviceName")
89         self.assertTrue(if_name.startswith("tap"))
90         
91         if_name = ec.get(tap2, "deviceName")
92         self.assertTrue(if_name.startswith("tap"))
93
94         ec.shutdown()
95
96     @skipIfAnyNotAliveWithIdentity
97     def t_tun_gre_tunnel(self, user1, host1, identity1, user2, host2, 
98             identity2):
99
100         ec = ExperimentController(exp_id="test-tun-gre-tunnel")
101         
102         node1 = ec.register_resource("planetlab::Node")
103         ec.set(node1, "hostname", host1)
104         ec.set(node1, "username", user1)
105         ec.set(node1, "identity", identity1)
106         ec.set(node1, "cleanExperiment", True)
107         ec.set(node1, "cleanProcesses", True)
108
109         tun1 = ec.register_resource("planetlab::Tun")
110         ec.set(tun1, "ip", "%s.1" % self.netblock)
111         ec.set(tun1, "prefix", "24")
112         ec.register_connection(tun1, node1)
113
114         node2 = ec.register_resource("planetlab::Node")
115         ec.set(node2, "hostname", host2)
116         ec.set(node2, "username", user2)
117         ec.set(node2, "identity", identity2)
118         ec.set(node2, "cleanExperiment", True)
119         ec.set(node2, "cleanProcesses", True)
120
121         tun2 = ec.register_resource("planetlab::Tun")
122         ec.set(tun2, "ip", "%s.2" % self.netblock)
123         ec.set(tun2, "prefix", "24")
124         ec.register_connection(tun2, node2)
125
126         udptun = ec.register_resource("linux::GRETunnel")
127         ec.register_connection(tun1, udptun)
128         ec.register_connection(tun2, udptun)
129
130         app = ec.register_resource("linux::Application")
131         cmd = "ping -c3 %s.2" % self.netblock
132         ec.set(app, "command", cmd)
133         ec.register_connection(app, node1)
134
135         ec.deploy()
136
137         ec.wait_finished(app)
138
139         ping = ec.trace(app, "stdout")
140         expected = """3 packets transmitted, 3 received, 0% packet loss"""
141         self.assertTrue(ping.find(expected) > -1)
142         
143         if_name = ec.get(tun1, "deviceName")
144         self.assertTrue(if_name.startswith("tun"))
145         
146         if_name = ec.get(tun2, "deviceName")
147         self.assertTrue(if_name.startswith("tun"))
148
149         ec.shutdown()
150
151     @skipIfAnyNotAliveWithIdentity
152     def t_tun_hybrid_gre_tunnel(self, user1, host1, identity1, 
153             user2, host2, identity2):
154
155         ec = ExperimentController(exp_id="test-tap-hybrid-gre-tunnel")
156         
157         node1 = ec.register_resource("planetlab::Node")
158         ec.set(node1, "hostname", host1)
159         ec.set(node1, "username", user1)
160         ec.set(node1, "identity", identity1)
161         ec.set(node1, "cleanExperiment", True)
162         ec.set(node1, "cleanProcesses", True)
163
164         tun1 = ec.register_resource("planetlab::Tun")
165         ec.set(tun1, "ip", "%s.1" % self.netblock)
166         ec.set(tun1, "prefix", "24")
167         ec.register_connection(tun1, node1)
168
169         node2 = ec.register_resource("linux::Node")
170         ec.set(node2, "hostname", host2)
171         ec.set(node2, "username", user2)
172         ec.set(node2, "identity", identity2)
173         ec.set(node2, "cleanExperiment", True)
174         ec.set(node2, "cleanProcesses", True)
175
176         tun2 = ec.register_resource("linux::Tun")
177         ec.set(tun2, "ip", "%s.2" % self.netblock)
178         ec.set(tun2, "prefix", "24")
179         ec.register_connection(tun2, node2)
180
181         gretun = ec.register_resource("linux::GRETunnel")
182         ec.register_connection(tun1, gretun)
183         ec.register_connection(tun2, gretun)
184
185         app = ec.register_resource("linux::Application")
186         # It seems the hybrid tunnel takes some time to setup... we add a sleep 5
187         # XXX: Debug this to see if it can be fixed on the RMs
188         cmd = "sleep 5; ping -c3 %s.2" % self.netblock
189         ec.set(app, "command", cmd)
190         ec.register_connection(app, node1)
191
192         ec.deploy()
193
194         ec.wait_finished(app)
195
196         ping = ec.trace(app, "stdout")
197         expected = """3 packets transmitted, 3 received, 0% packet loss"""
198         self.assertTrue(ping.find(expected) > -1)
199         
200         if_name = ec.get(tun1, "deviceName")
201         self.assertTrue(if_name.startswith("tun"))
202         
203         if_name = ec.get(tun2, "deviceName")
204         self.assertTrue(if_name.startswith("tun"))
205
206         ec.shutdown()
207
208     def test_tap_gre_tunnel(self):
209         self.t_tap_gre_tunnel(self.user, self.host1, self.identity,
210                 self.user, self.host2, self.identity)
211
212     def test_tun_gre_tunnel(self):
213         self.t_tun_gre_tunnel(self.user, self.host1, self.identity,
214                 self.user, self.host2, self.identity)
215
216     # does not work
217     def ztest_tun_hybrid_gre_tunnel(self):
218         self.t_tun_hybrid_gre_tunnel(self.user, self.host1, self.identity, 
219                 self.user, self.host3, self.identity)
220
221
222 if __name__ == '__main__':
223     unittest.main()
224