X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fns3%2Fns3application.py;h=681e1a11c870fa39e950a96fa992638561805f8c;hb=6285ca51026efb69642eea9dfc7c480e722d84a9;hp=aa11a722df5c5c91b7c699994a0df76aec7cfb31;hpb=6c5f918917a34e7093f5fdace2755094ec70752e;p=nepi.git diff --git a/src/nepi/resources/ns3/ns3application.py b/src/nepi/resources/ns3/ns3application.py index aa11a722..681e1a11 100644 --- a/src/nepi/resources/ns3/ns3application.py +++ b/src/nepi/resources/ns3/ns3application.py @@ -3,9 +3,8 @@ # Copyright (C) 2014 INRIA # # This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation; # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -24,17 +23,24 @@ from nepi.resources.ns3.ns3base import NS3Base class NS3BaseApplication(NS3Base): _rtype = "abstract::ns3::Application" + def __init__(self, ec, guid): + super(NS3BaseApplication, self).__init__(ec, guid) + self._node = None + @property def node(self): - from nepi.resources.ns3.ns3node import NS3BaseNode - nodes = self.get_connected(NS3BaseNode.get_rtype()) + if not self._node: + from nepi.resources.ns3.ns3node import NS3BaseNode + nodes = self.get_connected(NS3BaseNode.get_rtype()) - if not nodes: - msg = "Application not connected to node" - self.error(msg) - raise RuntimeError, msg + if not nodes: + msg = "Application not connected to node" + self.error(msg) + raise RuntimeError(msg) - return nodes[0] + self._node = nodes[0] + + return self._node @property def _rms_to_wait(self): @@ -55,12 +61,30 @@ class NS3BaseApplication(NS3Base): self.simulation.invoke(self.uuid, "Stop") self.set_stopped() + def do_start(self): + if self.simulation.state < ResourceState.STARTED: + self.debug("---- RESCHEDULING START ----" ) + self.ec.schedule(self.reschedule_delay, self.start) + else: + super(NS3BaseApplication, self).do_start() + self._start_time = self.simulation.start_time + @property def state(self): if self._state == ResourceState.STARTED: - is_running = self.simulation.invoke(self.uuid, "isAppRunning") - if not is_running: - self._state = ResourceState.STOPPED + try: + is_running = self.simulation.invoke(self.uuid, "isAppRunning") + + if not is_running: + self.set_stopped() + except: + msg = "Application failed. Can not retrieve state" + out = "" + + import traceback + err = traceback.format_exc() + self.error(msg, out, err) + self.do_fail() return self._state