Added routes to OMF nodes
[nepi.git] / examples / fd_cross_testbed_experiment.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 #
5 # Experiment Topology:
6 #
7 #  ns-3        |     NETNS 
8 #              |
9
10 #             fd   
11 #  n1 --- n2 ----- n3 --- n4
12 #              
13 #     0.0     1.0     2.0 
14
15
16 from nepi.core.design import ExperimentDescription, FactoriesProvider
17 from nepi.core.execute import ExperimentController
18 import getpass
19 import tempfile
20 import time
21
22 user = getpass.getuser()
23 root_dir = tempfile.mkdtemp()
24
25 def create_ns3_node(ns3_desc):
26     node = ns3_desc.create("ns3::Node")
27     ipv4 = ns3_desc.create("ns3::Ipv4L3Protocol")
28     arp  = ns3_desc.create("ns3::ArpL3Protocol")
29     icmp = ns3_desc.create("ns3::Icmpv4L4Protocol")
30     udp = ns3_desc.create("ns3::UdpL4Protocol")
31     node.connector("protos").connect(ipv4.connector("node"))
32     node.connector("protos").connect(arp.connector("node"))
33     node.connector("protos").connect(icmp.connector("node"))
34     node.connector("protos").connect(udp.connector("node"))
35     return node
36
37 exp_desc = ExperimentDescription()
38
39 ns3_provider = FactoriesProvider("ns3")
40 ns3_desc = exp_desc.add_testbed_description(ns3_provider)
41 ns3_desc.set_attribute_value("homeDirectory", root_dir)
42 ns3_desc.set_attribute_value("SimulatorImplementationType", "ns3::RealtimeSimulatorImpl")
43 ns3_desc.set_attribute_value("ChecksumEnabled", True)
44
45 node1 = create_ns3_node(ns3_desc)
46 iface12 = ns3_desc.create("ns3::PointToPointNetDevice")
47 queue12 = ns3_desc.create("ns3::DropTailQueue")
48 node1.connector("devs").connect(iface12.connector("node"))
49 iface12.connector("queue").connect(queue12.connector("dev"))
50 ip12 = iface12.add_address()
51 ip12.set_attribute_value("Address", "10.0.0.1")
52
53 node2 = create_ns3_node(ns3_desc)
54 iface21 = ns3_desc.create("ns3::PointToPointNetDevice")
55 queue21 = ns3_desc.create("ns3::DropTailQueue")
56 node2.connector("devs").connect(iface21.connector("node"))
57 iface21.connector("queue").connect(queue21.connector("dev"))
58 ip21 = iface21.add_address()
59 ip21.set_attribute_value("Address", "10.0.0.2")
60
61 chan = ns3_desc.create("ns3::PointToPointChannel")
62 iface12.connector("chan").connect(chan.connector("dev2"))
63 iface21.connector("chan").connect(chan.connector("dev2"))
64
65 iface23 = ns3_desc.create("ns3::FdNetDevice")
66 node2.connector("devs").connect(iface23.connector("node"))
67 ip23 = iface23.add_address()
68 ip23.set_attribute_value("Address", "10.0.1.1")
69
70 netns_provider = FactoriesProvider("netns")
71 netns_desc = exp_desc.add_testbed_description(netns_provider)
72 netns_desc.set_attribute_value("homeDirectory", root_dir)
73 #netns_desc.set_attribute_value("enableDebug", True)
74
75 node3 = netns_desc.create("Node")
76 iface32 = netns_desc.create("TapNodeInterface")
77 iface32.set_attribute_value("up", True)
78 node3.connector("devs").connect(iface32.connector("node"))
79 ip32 = iface32.add_address()
80 ip32.set_attribute_value("Address", "10.0.1.2")
81
82 iface23.connector("->fd").connect(iface32.connector("fd->"))
83
84 iface34 = netns_desc.create("P2PNodeInterface")
85 iface34.set_attribute_value("up", True)
86 node3.connector("devs").connect(iface34.connector("node"))
87 ip34 = iface34.add_address()
88 ip34.set_attribute_value("Address", "10.0.2.1")
89
90 node4 = netns_desc.create("Node")
91 node4.set_attribute_value("forward_X11", True)
92 iface43 = netns_desc.create("P2PNodeInterface")
93 iface43.set_attribute_value("up", True)
94 node4.connector("devs").connect(iface43.connector("node"))
95 ip43 = iface43.add_address()
96 ip43.set_attribute_value("Address", "10.0.2.2")
97
98 iface34.connector("p2p").connect(iface43.connector("p2p"))
99
100 route = node1.add_route()
101 route.set_attribute_value("Destination", "10.0.2.0")
102 route.set_attribute_value("NextHop", "10.0.0.2")
103
104 route = node2.add_route()
105 route.set_attribute_value("Destination", "10.0.2.0")
106 route.set_attribute_value("NextHop", "10.0.1.2")
107
108 route = node3.add_route()
109 route.set_attribute_value("Destination", "10.0.0.0")
110 route.set_attribute_value("NextHop", "10.0.1.1")
111
112 route = node4.add_route()
113 route.set_attribute_value("Destination", "10.0.0.0")
114 route.set_attribute_value("NextHop", "10.0.2.1")
115
116 app = netns_desc.create("Application")
117 app.set_attribute_value("command", "ping -qc 3 10.0.0.1")
118 app.set_attribute_value("user", user)
119 app.connector("node").connect(node4.connector("apps"))
120 app.enable_trace("stdout")
121       
122 xml = exp_desc.to_xml()
123
124 controller = ExperimentController(xml, root_dir)
125
126 controller.start()
127 while not controller.is_finished(app.guid):
128     time.sleep(0.5)
129
130 result = controller.trace(app.guid, "stdout")
131
132 controller.stop()
133 controller.shutdown()
134
135 print result
136