signal.signal(signal.SIGINT, _finalize)
def create_slice_desc(slicename, plc_host, pl_user, pl_pwd, pl_ssh_key,
- port_base, root_dir, exp_desc):
+ port_base, root_dir, proxy, exp_desc):
pl_provider = FactoriesProvider("planetlab")
slice_desc = exp_desc.add_testbed_description(pl_provider)
slice_desc.set_attribute_value("homeDirectory", root_dir)
slice_desc.set_attribute_value("authUser", pl_user)
slice_desc.set_attribute_value("authPass", pl_pwd)
slice_desc.set_attribute_value("plcHost", plc_host)
+ if proxy:
+ slice_desc.set_attribute_value("proxy", proxy)
slice_desc.set_attribute_value("tapPortBase", port_base)
slice_desc.set_attribute_value("p2pDeployment", True)
# Kills all running processes before starting the experiment
pl_node.connector("devs").connect(pl_iface.connector("node"))
return pl_node
-def create_ccnd(pl_node, routes, slice_desc):
+def create_ccnd(pl_node, port, routes, slice_desc):
pl_app = slice_desc.create("CCNxDaemon")
# We can specify a default ccnx version to be either ccnx-0.5.1 or ccnx-0.6.0
- #pl_app.set_attribute_value("ccnxversion", "ccnx-0.5.1")
-
+ #pl_app.set_attribute_value("ccnxVersion", "ccnx-0.5.1")
# We can also specify a custom local source and build and install directives
path_to_source = os.path.join(os.path.dirname(os.path.abspath(__file__)),
"ccnx-0.6.0rc3.tar.gz")
"cd ./ccnx-0.6.0rc3 && "
"./configure && make ")
pl_app.set_attribute_value("install", "cp -r ./ccnx-0.6.0rc3/bin ${SOURCES}")
- # We use a wildcard to replace the public IP address of the node during runtime
+
+ # We use a wildcard to replace the public IP address of the node during runtime,
+ # once this IP is known
routes = "|".join(map(lambda route: "udp {#[iface_%s].addr[0].[Address]#}" % route, routes))
- # Add multicast ccn routes
- pl_app.set_attribute_value("ccnroutes", routes)
+ # Add unicast ccn routes
+ pl_app.set_attribute_value("ccnRoutes", routes)
+
+ # Use a specific port to bind the CCNx daemon
+ if port:
+ pl_app.set_attribute_value("ccnLocalPort", port)
+
pl_app.enable_trace("stdout")
pl_app.enable_trace("stderr")
pl_app.connector("node").connect(pl_node.connector("apps"))
-def create_ccnsendchunks(pl_node, slice_desc):
+def create_ccnsendchunks(pl_node, port, slice_desc):
pl_app = slice_desc.create("Application")
path_to_video = os.path.join(os.path.dirname(os.path.abspath(__file__)),
"../big_buck_bunny_240p_mpeg4_lq.ts")
pl_app.set_attribute_value("stdin", path_to_video)
- pl_app.set_attribute_value("command", "ccnsendchunks ccnx:/VIDEO")
+
+ command = "ccnsendchunks ccnx:/VIDEO"
+ if port:
+ command = "CCN_LOCAL_PORT=%d %s " % (port, command)
+ pl_app.set_attribute_value("command", command)
+
pl_app.enable_trace("stdout")
pl_app.enable_trace("stderr")
pl_app.connector("node").connect(pl_node.connector("apps"))
return pl_app
-def exec_ccncatchunks(slicename, hostname):
+def exec_ccncatchunks(slicename, port, hostname):
print "Getting video chunks from %s ..." % hostname
+
+ command = 'PATH=$PATH:$(ls | egrep nepi-ccnd- | head -1)/bin;'
+ if port:
+ command += "CCN_LOCAL_PORT=%d " % port
+ command += ' ccncatchunks2 ccnx:/VIDEO'
+
login = "%s@%s" % (slicename, hostname)
- command = 'PATH=$PATH:$(ls | egrep nepi-ccnd- | head -1)/bin; ccncatchunks2 ccnx:/VIDEO'
- proc1 = subprocess.Popen(['ssh', login, command], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell = False)
- proc2 = subprocess.Popen(['vlc', '-'], stdin=proc1.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ proc1 = subprocess.Popen(['ssh',
+ '-o', 'StrictHostKeyChecking=no',
+ login,
+ command],
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell = False)
+
+ proc2 = subprocess.Popen(['vlc',
+ '--ffmpeg-threads=1',
+ '--sub-filter', 'marq',
+ '--marq-marquee',
+ '(c) copyright 2008, Blender Foundation / www.bigbuckbunny.org',
+ '--marq-position=8',
+ '--no-video-title-show', '-'],
+ stdin=proc1.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return proc2
def create_ed(hostnames, vsys_vnet, slicename, plc_host, pl_user, pl_pwd, pl_ssh_key,
- port_base, root_dir):
+ port_base, root_dir, delay, port, proxy):
# Create the experiment description object
exp_desc = ExperimentDescription()
# Create the slice description object
slice_desc = create_slice_desc(slicename, plc_host, pl_user, pl_pwd, pl_ssh_key,
- port_base, root_dir, exp_desc)
+ port_base, root_dir, proxy, exp_desc)
# Create the Internet box object
pl_inet = slice_desc.create("Internet")
for hostname in hostnames:
pl_node = pl_nodes[hostname]
routes = ccn_routes[hostname]
- create_ccnd(pl_node, routes, slice_desc)
+ create_ccnd(pl_node, port, routes, slice_desc)
# Create a ccnsendchunks application box in the first node
hostname = hostnames[0]
pl_node = pl_nodes[hostname]
- pl_app = create_ccnsendchunks(pl_node, slice_desc)
+ pl_app = create_ccnsendchunks(pl_node, port, slice_desc)
return exp_desc, pl_nodes, hostname, pl_app
def run(hostnames, vsys_vnet, slicename, plc_host, pl_user, pl_pwd, pl_ssh_key,
- port_base, root_dir):
+ port_base, root_dir, delay, port, proxy):
exp_desc, pl_nodes, hostname, pl_app = create_ed(hostnames, vsys_vnet,
slicename, plc_host, pl_user, pl_pwd, pl_ssh_key, port_base,
- root_dir)
+ root_dir, delay, port, proxy)
xml = exp_desc.to_xml()
controller = ExperimentController(xml, root_dir)
proc1 = None
if not TERMINATE:
hostname = hostnames[-1]
- proc1 = exec_ccncatchunks(slicename, hostname)
+ proc1 = exec_ccncatchunks(slicename, port, hostname)
if not TERMINATE and proc1:
- time.sleep(60)
+ time.sleep(delay)
proc2 = None
if not TERMINATE:
hostname = hostnames[-2]
- proc2 = exec_ccncatchunks(slicename, hostname)
+ proc2 = exec_ccncatchunks(slicename, port, hostname)
while not TERMINATE and proc1 and proc2 and proc2.poll() is None:
time.sleep(0.5)
-
+
if proc1:
if proc1.poll() < 1:
err = proc1.stderr.read()
'merkur.planetlab.haw-hamburg.de',
'planetlab1.cs.uit.no',
'planetlab3.cs.st-andrews.ac.uk',
- #'planetlab2.cs.uoi.gr',
+ 'planetlab2.cs.uoi.gr',
'planetlab3.xeno.cl.cam.ac.uk',
'planet2.inf.tu-dresden.de',
'planetlab2.csg.uzh.ch',
'planet2.elte.hu',
'planetlab2.esprit-tn.com' ]
- usage = "usage: %prog -s <pl_slice> -H <pl_host> -k <ssh_key> -u <pl_user> -p <pl_password> -v <vsys_vnet> -N <host_names> -c <node_count>"
+ ccn_local_port = os.environ.get('CCN_LOCAL_PORT')
+
+ usage = "usage: %prog -s <pl_slice> -H <pl_host> -k <ssh_key> -u <pl_user> -p <pl_password> -v <vsys_vnet> -N <host_names> -c <node_count> -d <delay> -P <ccn-local-port> -x <proxy>"
parser = OptionParser(usage=usage)
parser.add_option("-s", "--slicename", dest="slicename",
default=pl_hostnames, type="str")
parser.add_option("-c", "--node-count", dest="node_count",
help="Number of nodes to use",
- default=9, type="str")
+ default=9, type="int")
+ parser.add_option("-d", "--delay", dest="delay",
+ help="Time to wait before retrieveing the second video stream in seconds",
+ default=40, type="int")
+ parser.add_option("-P", "--ccn-local-port", dest="port",
+ help="Port to bind the CCNx daemon",
+ default=ccn_local_port, type="int")
+ parser.add_option("-x", "--proxy", dest="proxy",
+ help="Https proxy between here and PlanetLab machines",
+ default=None, type="str")
(options, args) = parser.parse_args()
hostnames = map(string.strip, options.hostnames.split(",")) if options.hostnames else default_hostnames
if options.node_count > 0 and options.node_count < len(hostnames):
hostnames = hostnames[0:options.node_count]
+
vsys_vnet = options.vsys_vnet
slicename = options.slicename
pl_host = options.pl_host
pl_user= options.pl_user
pl_pwd = options.pl_pwd
pl_ssh_key = options.pl_ssh_key
+ delay = options.delay
+ port = options.port
+ proxy = options.proxy
run(hostnames, vsys_vnet, slicename, pl_host, pl_user, pl_pwd, pl_ssh_key,
- port_base, root_dir)
+ port_base, root_dir, delay, port, proxy)