-#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
TUNIFACE = "TunInterface"
TAPIFACE = "TapInterface"
APPLICATION = "Application"
+CCNXDAEMON = "CCNxDaemon"
DEPENDENCY = "Dependency"
NEPIDEPENDENCY = "NepiDependency"
NS3DEPENDENCY = "NS3Dependency"
if app.depends:
node.required_packages.update(set(
app.depends.split() ))
-
+
if app.add_to_path:
if app.home_path and app.home_path not in node.pythonpath:
node.pythonpath.append(app.home_path)
testbed_instance.elements[guid] = element
+def create_ccnxdaemon(testbed_instance, guid):
+ parameters = testbed_instance._get_parameters(guid)
+ element = testbed_instance._make_application(parameters,
+ clazz = testbed_instance._app.CCNxDaemon )
+
+ # Just inject configuration stuff
+ element.home_path = "nepi-ccnd-%s" % (guid,)
+
+ testbed_instance.elements[guid] = element
+
def create_dependency(testbed_instance, guid):
parameters = testbed_instance._get_parameters(guid)
element = testbed_instance._make_dependency(parameters)
### Start/Stop functions ###
+def prestart_ccnxdaemon(testbed_instance, guid):
+ # ccnx daemon needs to start before the rest of the
+ # ccn applications
+ start_application(testbed_instance, guid)
+
+def stop_ccndaemon(testbed_instance, guid):
+ app = testbed_instance.elements[guid]
+ app.kill()
+
def start_application(testbed_instance, guid):
parameters = testbed_instance._get_parameters(guid)
traces = testbed_instance._get_traces(guid)
"help": "Connector to a routing daemon",
"name": "router",
"max": 1,
- "min": 1
+ "min": 0
}),
"fwd": dict({
"help": "Forwarder this routing daemon communicates with",
}),
dict({
"from": (TESTBED_ID, NODE, "apps"),
- "to": (TESTBED_ID, (APPLICATION, MULTICASTANNOUNCER), "node"),
+ "to": (TESTBED_ID, (APPLICATION, CCNXDAEMON, MULTICASTANNOUNCER), "node"),
"init_code": connect_dep,
"can_cross": False
}),
"flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
"validation_function": validation.is_string
}),
- "sudo": dict({
+ "ccnroutes": dict({
+ "name": "ccnroutes",
+ "help": "Route can be static (e.g. udp ip) or multicast (e.g. udp 224.0.0.204 2869). To separate different route use '|' ",
+ "type": Attribute.STRING,
+ "flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
+ "validation_function": validation.is_string
+ }),
+ "sudo": dict({
"name": "sudo",
"help": "Run with root privileges",
"type": Attribute.BOOL,
"flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
"validation_function": validation.is_string
}),
+ "ccnsources": dict({
+ "name": "ccnsources",
+ "help": "Path to local tar with ccnx sources."
+ "Default source is http://www.ccnx.org/releases/ccnx-0.5.1.tar.gz",
+ "type": Attribute.STRING,
+ "flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
+ "validation_function": validation.is_string
+ }),
+ "ccnxversion": dict({
+ "name": "ccnxversion",
+ "help": "Version of ccnx source code to install in the node.",
+ "type": Attribute.ENUM,
+ "value": "ccnx-0.6.0",
+ "flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
+ "allowed": ["ccnx-0.6.0",
+ "ccnx-0.5.1"],
+ "validation_function": validation.is_enum,
+ }),
"build": dict({
"name": "build",
"help": "Build commands to execute after deploying the sources. "
INTERNET, NODE, NODEIFACE, CLASSQUEUEFILTER, TOSQUEUEFILTER,
MULTICASTANNOUNCER, MULTICASTFORWARDER, MULTICASTROUTER,
TUNFILTER, TAPIFACE, TUNIFACE, NETPIPE,
- NEPIDEPENDENCY, NS3DEPENDENCY, DEPENDENCY, APPLICATION ]
+ NEPIDEPENDENCY, NS3DEPENDENCY, DEPENDENCY, CCNXDAEMON, APPLICATION ]
configure_order = [
INTERNET, Parallel(NODE),
NODEIFACE,
Parallel(MULTICASTANNOUNCER), Parallel(MULTICASTFORWARDER), Parallel(MULTICASTROUTER),
Parallel(TAPIFACE), Parallel(TUNIFACE), NETPIPE,
- Parallel(NEPIDEPENDENCY), Parallel(NS3DEPENDENCY), Parallel(DEPENDENCY), Parallel(APPLICATION) ]
+ Parallel(NEPIDEPENDENCY), Parallel(NS3DEPENDENCY), Parallel(DEPENDENCY), Parallel(CCNXDAEMON),
+ Parallel(APPLICATION)]
# Start (and prestart) node after ifaces, because the node needs the ifaces in order to set up routes
start_order = [ INTERNET,
Parallel(TAPIFACE), Parallel(TUNIFACE),
Parallel(NODE), NETPIPE,
Parallel(MULTICASTANNOUNCER), Parallel(MULTICASTFORWARDER), Parallel(MULTICASTROUTER),
- Parallel(NEPIDEPENDENCY), Parallel(NS3DEPENDENCY), Parallel(DEPENDENCY), Parallel(APPLICATION) ]
+ Parallel(NEPIDEPENDENCY), Parallel(NS3DEPENDENCY), Parallel(DEPENDENCY), Parallel(CCNXDAEMON),
+ Parallel(APPLICATION)]
# cleanup order
shutdown_order = [
Parallel(APPLICATION),
+ Parallel (CCNXDAEMON),
Parallel(MULTICASTROUTER), Parallel(MULTICASTFORWARDER), Parallel(MULTICASTANNOUNCER),
Parallel(TAPIFACE), Parallel(TUNIFACE), Parallel(NETPIPE),
Parallel(NEPIDEPENDENCY), Parallel(NS3DEPENDENCY), Parallel(DEPENDENCY),
"max_reliability",
"min_bandwidth",
"max_bandwidth",
+ "min_load",
+ "max_load",
+ "min_cpu",
+ "max_cpu",
# NEPI-in-NEPI attributes
ATTR_NEPI_TESTBED_ENVIRONMENT_SETUP,
"traces": ["stdout", "stderr", "buildlog", "output"],
"tags": [tags.APPLICATION],
}),
+
+ CCNXDAEMON: dict({
+ "help": "CCNx daemon",
+ "category": FC.CATEGORY_APPLICATIONS,
+ "create_function": create_ccnxdaemon,
+ "prestart_function": prestart_ccnxdaemon,
+ "status_function": status_application,
+ "stop_function": stop_application,
+ "configure_function": configure_application,
+ "box_attributes": ["ccnroutes", "ccnsources", "build",
+ "install", "ccnxversion", "sources"],
+ "connector_types": ["node"],
+ "traces": ["stdout", "stderr", "buildlog", "output"],
+ "tags": [tags.APPLICATION],
+ }),
DEPENDENCY: dict({
"help": "Requirement for package or application to be installed on some node",
"category": FC.CATEGORY_APPLICATIONS,
})
testbed_attributes = dict({
+ "slice_hrn": dict({
+ "name": "sliceHrn",
+ "help": "The hierarchical Resource Name (HRN) for the PlanetLab slice.",
+ "type": Attribute.STRING,
+ "flags": Attribute.ExecReadOnly | Attribute.ExecImmutable | Attribute.NoDefaultValue,
+ "validation_function": validation.is_string
+ }),
+ "sfa": dict({
+ "name": "sfa",
+ "help": "Activates the use of SFA for node reservation.",
+ "type": Attribute.BOOL,
+ "flags": Attribute.ExecReadOnly | Attribute.ExecImmutable | Attribute.NoDefaultValue,
+ "validation_function": validation.is_bool
+ }),
"slice": dict({
"name": "slice",
"help": "The name of the PlanetLab slice to use",
"range": (2000,30000),
"validation_function": validation.is_integer_range(2000,30000)
}),
- "dedicated_slice": dict({
- "name": "dedicatedSlice",
+ "clean_proc": dict({
+ "name": "cleanProc",
"help": "Set to True if the slice will be dedicated to this experiment. "
- "NEPI will perform node and slice cleanup, making sure slices are "
+ "NEPI will perform node and slice process cleanup, making sure slices are "
"in a clean, repeatable state before running the experiment.",
"type": Attribute.BOOL,
"value": False,
"flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
"validation_function": validation.is_bool
}),
+ "clean_home": dict({
+ "name": "cleanHome",
+ "help": "Set to True all preexistent directories in the home "
+ "directory of each sliver will be removed before the "
+ "start of the experiment.",
+ "type": Attribute.BOOL,
+ "value": False,
+ "flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
+ "validation_function": validation.is_bool
+ }),
})
supported_recovery_policies = [