+ Implemented option to cleanup directories on PlanetLab slivers.
[nepi.git] / examples / tunnel_cross_testbed_experiment.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 import getpass
5 from nepi.core.design import ExperimentDescription, FactoriesProvider
6 from nepi.core.execute import ExperimentController
7 from nepi.util import proxy
8 from nepi.util.constants import DeploymentConfiguration as DC
9 import os
10 import shutil
11 import tempfile
12 import time
13
14 root_dir = tempfile.mkdtemp()
15 netns_root_dir = os.path.join(root_dir, "netns")
16 os.makedirs(netns_root_dir)
17 user = getpass.getuser()
18 slicename = os.environ["PL_SLICE"]
19 plchost = "www.planet-lab.eu"
20 port_base = 2000 + (os.getpid() % 1000) * 13
21 pl_ssh_key = os.environ.get(
22     "PL_SSH_KEY",
23     "%s/.ssh/id_rsa_planetlab" % (os.environ['HOME'],) )
24 pl_user = os.environ.get('PL_USER')
25 pl_pwd = os.environ.get('PL_PASS')
26
27 exp_desc = ExperimentDescription()
28
29 pl_provider = FactoriesProvider("planetlab")
30 pl_desc = exp_desc.add_testbed_description(pl_provider)
31 pl_desc.set_attribute_value("homeDirectory", root_dir)
32 pl_desc.set_attribute_value("slice", slicename)
33 pl_desc.set_attribute_value("sliceSSHKey", pl_ssh_key)
34 pl_desc.set_attribute_value("authUser", pl_user)
35 pl_desc.set_attribute_value("authPass", pl_pwd)
36 pl_desc.set_attribute_value("plcHost", plchost)
37 pl_desc.set_attribute_value("tapPortBase", port_base)
38 pl_desc.set_attribute_value("p2pDeployment", False) # it's interactive, we don't want it in tests
39 pl_desc.set_attribute_value("dedicatedSlice", True)
40 pl_desc.set_attribute_value("plLogLevel", "DEBUG")
41        
42 pl_inet = pl_desc.create("Internet")
43
44 pl_node = pl_desc.create("Node")
45 pl_iface = pl_desc.create("NodeInterface")
46 pl_iface.connector("inet").connect(pl_inet.connector("devs"))
47 pl_node.connector("devs").connect(pl_iface.connector("node"))
48
49 pl_tap = pl_desc.create("TunInterface")
50 pl_tap.enable_trace("pcap")
51 pl_tap.enable_trace("packets")
52 pl_node.connector("devs").connect(pl_tap.connector("node"))
53
54 ip1 = pl_tap.add_address()
55 ip1.set_attribute_value("Address", "192.168.3.1")
56 ip1.set_attribute_value("NetPrefix", 24)
57
58 netns_provider = FactoriesProvider("netns")
59 netns_desc = exp_desc.add_testbed_description(netns_provider)
60 netns_desc.set_attribute_value("homeDirectory", root_dir)
61 netns_desc.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
62 netns_desc.set_attribute_value(DC.ROOT_DIRECTORY, netns_root_dir)
63 netns_desc.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL)
64 netns_desc.set_attribute_value(DC.USE_SUDO, True)
65
66 netns_node = netns_desc.create("Node")
67 netns_node.set_attribute_value("forward_X11", True)
68
69 netns_tap = netns_desc.create("TunNodeInterface")
70 netns_tap.set_attribute_value("up", True)
71 netns_tap.set_attribute_value("mtu", 1448)
72 netns_node.connector("devs").connect(netns_tap.connector("node"))
73 netns_tunchannel = netns_desc.create("TunChannel")
74 netns_tunchannel.connector("->fd").connect(netns_tap.connector("fd->"))
75
76 pl_tap.connector("tcp").connect(netns_tunchannel.connector("tcp"))
77
78 ip2 = netns_tap.add_address()
79 ip2.set_attribute_value("Address", "192.168.3.2")
80 ip2.set_attribute_value("NetPrefix", 30)
81
82 app = netns_desc.create("Application")
83 app.set_attribute_value("command", "xterm")
84 app.set_attribute_value("user", user)
85 app.connector("node").connect(netns_node.connector("apps"))
86
87 xml = exp_desc.to_xml()
88
89 controller = ExperimentController(xml, root_dir)
90 controller.start()
91 while not controller.is_finished(app.guid):
92     time.sleep(0.5)
93
94 controller.stop()
95 controller.shutdown()
96