X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fns3%2Fns3dceapplication.py;h=d4ae7eb18edd8a92a82022b819b9b7a37c5addb3;hb=aa88e26ae289dd86610141b6d9f9103b53494f4d;hp=4b40ef9310ab55e7d2235026661cfaff316f976a;hpb=ac866efb762875550bdc0c05d693e5eb026f435e;p=nepi.git diff --git a/src/nepi/resources/ns3/ns3dceapplication.py b/src/nepi/resources/ns3/ns3dceapplication.py index 4b40ef93..d4ae7eb1 100644 --- a/src/nepi/resources/ns3/ns3dceapplication.py +++ b/src/nepi/resources/ns3/ns3dceapplication.py @@ -20,6 +20,7 @@ from nepi.execution.attribute import Attribute, Flags, Types 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 @@ -32,9 +33,9 @@ class NS3BaseDceApplication(NS3BaseApplication): _rtype = "abstract::ns3::DceApplication" # Lock used to synchronize usage of DceManagerHelper - dce_manager_lock = threading.Lock() + _dce_manager_lock = threading.Lock() # Lock used to synchronize usage of DceApplicationHelper - dce_application_lock = threading.Lock() + _dce_application_lock = threading.Lock() _dce_manager_helper_uuid = None _dce_application_helper_uuid = None @@ -83,36 +84,43 @@ 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 + def __init__(self, ec, guid): + super(NS3BaseDceApplication, self).__init__(ec, guid) + self._pid = None - return nodes[0] + @property + def pid(self): + return self._pid @property def dce_manager_helper_uuid(self): - if not self._dce_manager_helper_uuid: - self._dce_manager_helper_uuid = self.simulation.create( - "DceManagerHelper") + if not NS3BaseDceApplication._dce_manager_helper_uuid: + NS3BaseDceApplication._dce_manager_helper_uuid = \ + self.simulation.create("DceManagerHelper") - if self.get("useDlmLoader"): - self.simulation.invoke( - self._dce_manager_helper_uuid, "SetLoader", - "ns3::DlmLoaderFactory") + if self.get("useDlmLoader"): + self.simulation.invoke( + NS3BaseDceApplication._dce_manager_helper_uuid, + "SetLoader", + "ns3::DlmLoaderFactory") - return self._dce_manager_helper_uuid + return NS3BaseDceApplication._dce_manager_helper_uuid @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 + 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 def _instantiate_object(self): pass @@ -160,6 +168,7 @@ class NS3BaseDceApplication(NS3BaseApplication): self.dce_application_helper_uuid, "InstallInNode", self.node.uuid) + """ container_uuid = self.simulation.create("NodeContainer") self.simulation.invoke(container_uuid, "Add", self.node.uuid) @@ -188,37 +197,35 @@ class NS3BaseDceApplication(NS3BaseApplication): self.debug("---- RESCHEDULING 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") - 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_running or self.simulation.state > Resource.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, + self._pid = self.simulation.invoke(self.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) + + 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)