X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fns3%2Fns3dceapplication.py;h=89725c369f902c585c25aaa52d601189a5d040f9;hb=1718dbd1b5558f36bae96ac613dc7980128bb52e;hp=acaf0e6efebeb39eedb0e0dd1d0c590dfca84b74;hpb=df7b32bd237adac72e5c956911720ab52567bb9b;p=nepi.git diff --git a/src/nepi/resources/ns3/ns3dceapplication.py b/src/nepi/resources/ns3/ns3dceapplication.py index acaf0e6e..89725c36 100644 --- a/src/nepi/resources/ns3/ns3dceapplication.py +++ b/src/nepi/resources/ns3/ns3dceapplication.py @@ -18,15 +18,28 @@ # Author: Alina Quereilhac from nepi.execution.attribute import Attribute, Flags, Types -from nepi.execution.resource import clsinit_copy, ResourceState, reschedule_delay +from nepi.execution.resource import clsinit_copy, ResourceState from nepi.resources.ns3.ns3application import NS3BaseApplication +from nepi.execution.trace import TraceAttr -import os +from nepi.resources.ns3.ns3wrapper import SIMULATOR_UUID +import os +import time +import threading + @clsinit_copy class NS3BaseDceApplication(NS3BaseApplication): _rtype = "abstract::ns3::DceApplication" + # Lock used to synchronize usage of DceManagerHelper + _dce_manager_lock = threading.Lock() + # Lock used to synchronize usage of DceApplicationHelper + _dce_application_lock = threading.Lock() + + _dce_manager_helper_uuid = None + _dce_application_helper_uuid = None + @classmethod def _register_attributes(cls): binary = Attribute("binary", @@ -48,26 +61,67 @@ class NS3BaseDceApplication(NS3BaseApplication): "DCE environment variables.", flags = Flags.Design) + use_dlm = Attribute("useDlmLoader", + "Use ns3::DlmLoaderFactory as library loader", + type = Types.Bool, + flags = Flags.Design) + + starttime = Attribute("StartTime", + "Time at which the application will start", + default = "+0.0ns", + flags = Flags.Reserved | Flags.Construct) + + stoptime = Attribute("StopTime", + "Time at which the application will stop", + default = "+0.0ns", + flags = Flags.Reserved | Flags.Construct) + cls._register_attribute(binary) cls._register_attribute(stack_size) cls._register_attribute(arguments) cls._register_attribute(environment) + cls._register_attribute(use_dlm) + cls._register_attribute(stoptime) + cls._register_attribute(starttime) + + def __init__(self, ec, guid): + super(NS3BaseDceApplication, self).__init__(ec, guid) + self._pid = None + + @property + def pid(self): + return self._pid @property - def node(self): - from nepi.resources.ns3.ns3node import NS3BaseNode - nodes = self.get_connected(NS3BaseNode.get_rtype()) + def dce_manager_helper_uuid(self): + if not NS3BaseDceApplication._dce_manager_helper_uuid: + NS3BaseDceApplication._dce_manager_helper_uuid = \ + self.simulation.create("DceManagerHelper") + + if self.get("useDlmLoader"): + self.simulation.invoke( + NS3BaseDceApplication._dce_manager_helper_uuid, + "SetLoader", + "ns3::DlmLoaderFactory") - if not nodes: - msg = "DceApplication not connected to node" - self.error(msg) - raise RuntimeError, msg + return NS3BaseDceApplication._dce_manager_helper_uuid - if nodes[0].get("enableDCE") == False: - raise RuntimeError("DceApplication not connected to DCE enabled node") + @property + def dce_application_helper_uuid(self): + if not NS3BaseDceApplication._dce_application_helper_uuid: + NS3BaseDceApplication._dce_application_helper_uuid = \ + self.simulation.create("DceApplicationHelper") + + return NS3BaseDceApplication._dce_application_helper_uuid + + @property + def dce_manager_lock(self): + return NS3BaseDceApplication._dce_manager_lock + + @property + def dce_application_lock(self): + return NS3BaseDceApplication._dce_application_lock - return nodes[0] - def _instantiate_object(self): pass @@ -78,59 +132,51 @@ class NS3BaseDceApplication(NS3BaseApplication): # Preventing concurrent access to the DceApplicationHelper # from different DceApplication RMs - with self.simulation.dce_application_lock: + with self.dce_application_lock: self.simulation.invoke( - self.simulation.dce_application_helper_uuid, + self.dce_application_helper_uuid, "ResetArguments") self.simulation.invoke( - self.simulation.dce_application_helper_uuid, + self.dce_application_helper_uuid, "ResetEnvironment") self.simulation.invoke( - self.simulation.dce_application_helper_uuid, + self.dce_application_helper_uuid, "SetBinary", self.get("binary")) self.simulation.invoke( - self.simulation.dce_application_helper_uuid, + self.dce_application_helper_uuid, "SetStackSize", self.get("stackSize")) - arguments = self.get("arguments") or "" - for arg in map(str.strip, arguments.split(";")): - self.simulation.invoke( - self.simulation.dce_application_helper_uuid, - "AddArgument", arg) - - environment = self.get("environment") or "" - for env in map(str.strip, environment.split(";")): - key, val = env.split("=") - self.simulation.invoke( - self.simulation.dce_application_helper_uuid, - "AddEnvironment", key, val) - - if self.has_attribute("files"): - files = self.get("files") or "" - for files in map(str.strip, files.split(";")): - remotepath, dcepath = env.split("=") - localpath = "${SHARE}/" + os.path.basename(remotepath) + arguments = self.get("arguments") + if arguments: + for arg in map(str.strip, arguments.split(";")): self.simulation.invoke( - self.simulation.dce_application_helper_uuid, - "AddFile", localpath, dcepath) - - if self.has_attribute("stdinFile"): - stdinfile = self.get("stdinFile") - if stdinfile: - if stdinfile != "": - stdinfile = "${SHARE}/" + os.path.basename(stdinfile) - + self.dce_application_helper_uuid, + "AddArgument", arg) + + environment = self.get("environment") + if environment: + for env in map(str.strip, environment.split(";")): + key, val = env.split("=") self.simulation.invoke( - self.simulation.dce_application_helper_uuid, - "SetStdinFile", stdinfile) + self.dce_application_helper_uuid, + "AddEnvironment", key, val) apps_uuid = self.simulation.invoke( - self.simulation.dce_application_helper_uuid, + self.dce_application_helper_uuid, "InstallInNode", self.node.uuid) + + """ + container_uuid = self.simulation.create("NodeContainer") + self.simulation.invoke(container_uuid, "Add", self.node.uuid) + apps_uuid = self.simulation.invoke( + self.dce_application_helper_uuid, + "Install", container_uuid) + """ + self._uuid = self.simulation.invoke(apps_uuid, "Get", 0) if self.has_changed("StartTime"): @@ -149,22 +195,37 @@ class NS3BaseDceApplication(NS3BaseApplication): def do_start(self): if self.simulation.state < ResourceState.STARTED: self.debug("---- RESCHEDULING START ----" ) - self.ec.schedule(reschedule_delay, self.start) + self.ec.schedule(self.reschedule_delay, self.start) else: - self._configure_traces() - super(NS3BaseApplication, self).do_start() - self._start_time = self.simulation.start_time + is_app_running = self.simulation.invoke(self.uuid, "isAppRunning") + + if is_app_running or self.simulation.state > ResourceState.STARTED: + super(NS3BaseApplication, self).do_start() + self._start_time = self.simulation.start_time + else: + # Reschedule until dce application is actually started + self.debug("---- RESCHEDULING START ----" ) + self.ec.schedule(self.reschedule_delay, self.start) + + def trace(self, name, attr = TraceAttr.ALL, block = 512, offset = 0): + self._configure_traces() + return super(NS3BaseDceApplication, self).trace(name, attr = attr, + block = block, offset = offset) def _configure_traces(self): - # Preventing concurrent access to the DceApplicationHelper + if self.pid is not None: + return + + # Using lock to prevent concurrent access to the DceApplicationHelper # from different DceApplication RMs - with self.simulation.dce_application_lock: - pid = self.simulation.invoke(self.simulation.dce_application_helper_uuid, - "GetPid", self._uuid) - node_id = self.simulation.invoke(self.node.uuid, "GetId") - self._trace_filename["stdout"] = "files-%s/var/log/%s/stdout" % (node_id, pid) - self._trace_filename["stderr"] = "files-%s/var/log/%s/stderr" % (node_id, pid) - self._trace_filename["status"] = "files-%s/var/log/%s/status" % (node_id, pid) - self._trace_filename["cmdline"] = "files-%s/var/log/%s/cmdline" % (node_id, pid) + with self.dce_application_lock: + self._pid = self.simulation.invoke(self.dce_application_helper_uuid, + "GetPid", self.uuid) + + node_id = self.node.node_id + self._trace_filename["stdout"] = "files-%s/var/log/%s/stdout" % (node_id, self.pid) + self._trace_filename["stderr"] = "files-%s/var/log/%s/stderr" % (node_id, self.pid) + self._trace_filename["status"] = "files-%s/var/log/%s/status" % (node_id, self.pid) + self._trace_filename["cmdline"] = "files-%s/var/log/%s/cmdline" % (node_id, self.pid)