X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fns3%2Fns3dceapplication.py;h=0b3d3028d80ac8be3f76d8e62f3a5866d3937594;hb=ab10a02343c96c9b716956ea9f0319d77c183df0;hp=c42e32b43d1989be61b593f1177e3134e5757acc;hpb=4848185445ea2532536b78dfbdb7787e7fafb57f;p=nepi.git diff --git a/src/nepi/resources/ns3/ns3dceapplication.py b/src/nepi/resources/ns3/ns3dceapplication.py index c42e32b4..0b3d3028 100644 --- a/src/nepi/resources/ns3/ns3dceapplication.py +++ b/src/nepi/resources/ns3/ns3dceapplication.py @@ -18,8 +18,9 @@ # 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 from nepi.resources.ns3.ns3wrapper import SIMULATOR_UUID @@ -31,14 +32,6 @@ import threading 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", @@ -83,36 +76,13 @@ class NS3BaseDceApplication(NS3BaseApplication): cls._register_attribute(stoptime) cls._register_attribute(starttime) - @property - def node(self): - from nepi.resources.ns3.ns3node import NS3BaseNode - nodes = self.get_connected(NS3BaseNode.get_rtype()) - - if not nodes: - msg = "DceApplication not connected to node" - self.error(msg) - raise RuntimeError, msg - - return nodes[0] - - @property - def dce_manager_helper_uuid(self): - if not self._dce_manager_helper_uuid: - self._dce_manager_helper_uuid = self.simulation.create( - "DceManagerHelper") - - if self.get("useDlmLoader"): - self.simulation.invoke( - self._dce_manager_helper_uuid, "SetLoader", - "ns3::DlmLoaderFactory") - - return self._dce_manager_helper_uuid + def __init__(self, ec, guid): + super(NS3BaseDceApplication, self).__init__(ec, guid) + self._pid = None @property - def dce_application_helper_uuid(self): - if not self._dce_application_helper_uuid: - self._dce_application_helper_uuid = self.simulation.create("DceApplicationHelper") - return self._dce_application_helper_uuid + def pid(self): + return self._pid def _instantiate_object(self): pass @@ -124,50 +94,37 @@ class NS3BaseDceApplication(NS3BaseApplication): # Preventing concurrent access to the DceApplicationHelper # from different DceApplication RMs - with self.dce_application_lock: - self.simulation.invoke( - self.dce_application_helper_uuid, - "ResetArguments") + dce_helper = self.simulation.dce_helper + + with dce_helper.dce_application_lock: + dce_app_uuid = dce_helper.dce_application_uuid + + self.simulation.invoke(dce_app_uuid, "ResetArguments") - self.simulation.invoke( - self.dce_application_helper_uuid, - "ResetEnvironment") + self.simulation.invoke(dce_app_uuid, "ResetEnvironment") - self.simulation.invoke( - self.dce_application_helper_uuid, + self.simulation.invoke(dce_app_uuid, "SetBinary", self.get("binary")) - self.simulation.invoke( - self.dce_application_helper_uuid, + self.simulation.invoke(dce_app_uuid, "SetStackSize", self.get("stackSize")) arguments = self.get("arguments") if arguments: for arg in map(str.strip, arguments.split(";")): - self.simulation.invoke( - self.dce_application_helper_uuid, + self.simulation.invoke(dce_app_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.dce_application_helper_uuid, + self.simulation.invoke(dce_app_uuid, "AddEnvironment", key, val) - apps_uuid = self.simulation.invoke( - self.dce_application_helper_uuid, + apps_uuid = self.simulation.invoke(dce_app_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"): @@ -186,39 +143,41 @@ 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_started = self.simulation.invoke(self.uuid, "isAppStarted") - def _configure_traces(self): - # Waiting until dce application is actually started - is_running = False - for i in xrange(200): - is_running = self.simulation.invoke(self.uuid, "isAppRunning") - is_finished = self.simulation.invoke(SIMULATOR_UUID, "isFinished") - - if is_running or is_finished: - break + if is_app_started or self.simulation.state > ResourceState.STARTED: + super(NS3BaseApplication, self).do_start() + self._start_time = self.simulation.start_time else: - time.sleep(1) - else: - if not is_running: - msg = " Application did not start" - self.error(msg) - raise RuntimeError + # 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): + if self.pid is not None: + return # Using lock to prevent concurrent access to the DceApplicationHelper # from different DceApplication RMs - with self.dce_application_lock: - pid = self.simulation.invoke(self.dce_application_helper_uuid, + dce_helper = self.simulation.dce_helper + + with dce_helper.dce_application_lock: + dce_app_uuid = dce_helper.dce_application_uuid + + self._pid = self.simulation.invoke(dce_app_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) + + 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)