PlanetLab support toon-up: home_cleanup only nepi folders + make server support longe...
[nepi.git] / examples / vlc_cross_testbed_experiment.py
1 #!/usr/bin/env python
2
3 from nepi.core.design import ExperimentDescription, FactoriesProvider
4 from nepi.core.execute import ExperimentController
5 import getpass
6 import tempfile
7 import time
8
9 def add_ns3_random_mobility(node, ns3_desc, x, y, z, speed, 
10         bounds_width, bounds_height):
11     position = "%d:%d:%d" % (x, y, z)
12     bounds = "0|%d|0|%d" % (bounds_width, bounds_height) 
13     speed = "Constant:%d" % speed
14     mobility = ns3_desc.create("ns3::RandomDirection2dMobilityModel")
15     mobility.set_attribute_value("Position", position)
16     mobility.set_attribute_value("Bounds", bounds)
17     mobility.set_attribute_value("Speed", speed)
18     mobility.set_attribute_value("Pause",  "Constant:1")
19     node.connector("mobility").connect(mobility.connector("node"))
20     return mobility
21
22 def add_ns3_constant_mobility(node, ns3_desc, x, y, z):
23     mobility = ns3_desc.create("ns3::ConstantPositionMobilityModel") 
24     position = "%d:%d:%d" % (x, y, z)
25     mobility.set_attribute_value("Position", position)
26     node.connector("mobility").connect(mobility.connector("node"))
27     return mobility
28
29 def add_ns3_wifi_channel(ns3_desc):
30     channel = ns3_desc.create("ns3::YansWifiChannel")
31     delay = ns3_desc.create("ns3::ConstantSpeedPropagationDelayModel")
32     loss  = ns3_desc.create("ns3::LogDistancePropagationLossModel")
33     channel.connector("delay").connect(delay.connector("chan"))
34     channel.connector("loss").connect(loss.connector("prev"))
35     return channel
36
37 def add_ip_address(iface, address):
38     ip = iface.add_address()
39     ip.set_attribute_value("Address", address)
40
41 def add_route(node, destination, netprefix, nexthop):
42     route = node.add_route()
43     route.set_attribute_value("Destination", destination)
44     route.set_attribute_value("NetPrefix", netprefix)
45     route.set_attribute_value("NextHop", nexthop)
46
47 def add_ns3_wifi(node, ns3_desc, access_point = False):
48     wifi = ns3_desc.create("ns3::WifiNetDevice")
49     node.connector("devs").connect(wifi.connector("node"))
50
51     phy = ns3_desc.create("ns3::YansWifiPhy")
52     error = ns3_desc.create("ns3::NistErrorRateModel")
53     manager = ns3_desc.create("ns3::ArfWifiManager")
54     if access_point:
55         mac = ns3_desc.create("ns3::ApWifiMac")
56     else:
57         mac = ns3_desc.create("ns3::StaWifiMac")
58
59     phy.set_attribute_value("Standard", "WIFI_PHY_STANDARD_80211a")
60     mac.set_attribute_value("Standard", "WIFI_PHY_STANDARD_80211a")
61     phy.connector("err").connect(error.connector("phy"))
62     wifi.connector("phy").connect(phy.connector("dev"))
63     wifi.connector("mac").connect(mac.connector("dev"))
64     wifi.connector("manager").connect(manager.connector("dev"))
65     #phy.enable_trace("YansWifiPhyPcapTrace")
66     return wifi, phy
67
68 def add_netns_tap(node, netns_desc):
69     tap = netns_desc.create("TapNodeInterface")
70     tap.set_attribute_value("up", True)
71     node.connector("devs").connect(tap.connector("node"))
72     return tap
73
74 def add_ns3_fdnd(node, ns3_desc):
75     fdnd = ns3_desc.create("ns3::FdNetDevice")
76     node.connector("devs").connect(fdnd.connector("node"))
77     #fdnd.enable_trace("FileDescriptorPcapTrace")
78     return fdnd
79
80 def add_ns3_node(ns3_desc):
81     node = ns3_desc.create("ns3::Node")
82     ipv4 = ns3_desc.create("ns3::Ipv4L3Protocol")
83     arp  = ns3_desc.create("ns3::ArpL3Protocol")
84     icmp = ns3_desc.create("ns3::Icmpv4L4Protocol")
85     udp = ns3_desc.create("ns3::UdpL4Protocol")
86     node.connector("protos").connect(ipv4.connector("node"))
87     node.connector("protos").connect(arp.connector("node"))
88     node.connector("protos").connect(icmp.connector("node"))
89     node.connector("protos").connect(udp.connector("node"))
90     return node
91
92 user = getpass.getuser()
93 root_dir = tempfile.mkdtemp()
94 movie = "/home/alina/repos/nepi/big_buck_bunny_240p_mpeg4_lq.ts" 
95 bounds_width = bounds_height = 200
96 x = y = 100
97 speed = 1
98
99 exp_desc = ExperimentDescription()
100
101 ns3_provider = FactoriesProvider("ns3")
102 ns3_desc = exp_desc.add_testbed_description(ns3_provider)
103 ns3_dir = tempfile.mkdtemp()
104 ns3_desc.set_attribute_value("rootDirectory", ns3_dir)
105 ns3_desc.set_attribute_value("SimulatorImplementationType", "ns3::RealtimeSimulatorImpl")
106 ns3_desc.set_attribute_value("ChecksumEnabled", True)
107
108 netns_provider = FactoriesProvider("netns")
109 netns_desc1 = exp_desc.add_testbed_description(netns_provider)
110 netns_dir1 = tempfile.mkdtemp()
111 netns_desc1.set_attribute_value("rootDirectory", netns_dir1)
112 netns_desc1.set_attribute_value("enableDebug", True)
113 netns_desc1.set_attribute_value("useSudo", True)
114 netns_desc1.set_attribute_value("deployment_communication", "LOCAL")
115 netns_desc1.set_attribute_value("deployment_mode", "DAEMON")
116
117 netns_provider = FactoriesProvider("netns")
118 netns_desc2 = exp_desc.add_testbed_description(netns_provider)
119 netns_dir2 = tempfile.mkdtemp()
120 netns_desc2.set_attribute_value("rootDirectory", netns_dir2)
121 netns_desc2.set_attribute_value("enableDebug", True)
122 netns_desc2.set_attribute_value("useSudo", True)
123 netns_desc2.set_attribute_value("deployment_communication", "LOCAL")
124 netns_desc2.set_attribute_value("deployment_mode", "DAEMON")
125
126 node1 = netns_desc1.create("Node")
127 node1.set_attribute_value("forward_X11", True)
128 tap1 = netns_desc1.create("TapNodeInterface")
129 tap1.set_attribute_value("up", True)
130 node1.connector("devs").connect(tap1.connector("node"))
131 ip = tap1.add_address()
132 ip.set_attribute_value("Address", "10.0.0.1")
133
134 node2 = add_ns3_node(ns3_desc)
135 fdnd1 = add_ns3_fdnd(node2, ns3_desc)
136 add_ip_address(fdnd1, "10.0.0.2")
137
138 fdnd1.connector("->fd").connect(tap1.connector("fd->"))
139
140 mobility1 = add_ns3_constant_mobility(node2, ns3_desc, x, y, 0)
141 wifi1, phy1 = add_ns3_wifi(node2, ns3_desc, access_point = False)
142 add_ip_address(wifi1, "10.0.1.1")
143
144 node3 = add_ns3_node(ns3_desc)
145 mobility2 = add_ns3_random_mobility(node3, ns3_desc, x, y, 0, 
146         speed, bounds_width, bounds_height)
147 wifi2, phy2 = add_ns3_wifi(node3, ns3_desc, access_point = True)
148 add_ip_address(wifi2, "10.0.1.2")
149
150 wifichan = add_ns3_wifi_channel(ns3_desc)
151 phy1.connector("chan").connect(wifichan.connector("phys"))
152 phy2.connector("chan").connect(wifichan.connector("phys"))
153
154 fdnd2 = add_ns3_fdnd(node3, ns3_desc)
155 add_ip_address(fdnd2, "10.0.2.1")
156
157 node4 = netns_desc2.create("Node")
158 node4.set_attribute_value("forward_X11", True)
159 tap2 = netns_desc2.create("TapNodeInterface")
160 tap2.set_attribute_value("up", True)
161 node4.connector("devs").connect(tap2.connector("node"))
162 ip = tap2.add_address()
163 ip.set_attribute_value("Address", "10.0.2.2")
164
165 fdnd2.connector("->fd").connect(tap2.connector("fd->"))
166
167 route = node1.add_route()
168 route.set_attribute_value("Destination", "10.0.2.0")
169 route.set_attribute_value("NextHop", "10.0.0.2")
170
171 route = node1.add_route()
172 route.set_attribute_value("Destination", "10.0.1.0")
173 route.set_attribute_value("NextHop", "10.0.0.2")
174
175 route = node2.add_route()
176 route.set_attribute_value("Destination", "10.0.2.0")
177 route.set_attribute_value("NextHop", "10.0.1.2")
178
179 route = node3.add_route()
180 route.set_attribute_value("Destination", "10.0.0.0")
181 route.set_attribute_value("NextHop", "10.0.1.1")
182
183 route = node4.add_route()
184 route.set_attribute_value("Destination", "10.0.1.0")
185 route.set_attribute_value("NextHop", "10.0.2.1")
186
187 route = node4.add_route()
188 route.set_attribute_value("Destination", "10.0.0.0")
189 route.set_attribute_value("NextHop", "10.0.2.1")
190
191 app1 = netns_desc1.create("Application")
192 server = "10.0.2.2" 
193 command = "xauth -b quit; vlc -I dummy -vvv %s --sout '#rtp{dst=%s,port=5004,mux=ts}' vlc://quit" \
194         % (movie, server)
195 #command = "xterm"
196 app1.set_attribute_value("command", command)
197 app1.set_attribute_value("user", user)
198 app1.connector("node").connect(node1.connector("apps"))
199
200 app4 = netns_desc2.create("Application")
201 command = "xauth -b quit; vlc --ffmpeg-threads=1 rtp://%s:5004/test.ts" % server
202 #command = "xterm"
203 app4.set_attribute_value("command", command)
204 app4.set_attribute_value("user", user)
205 app4.connector("node").connect(node4.connector("apps"))
206
207 xml = exp_desc.to_xml()
208
209 controller = ExperimentController(xml, root_dir)
210
211 controller.start()
212 while not controller.is_finished(app4.guid):
213     time.sleep(0.5)
214
215 controller.stop()
216 controller.shutdown()
217
218