X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fns3%2Fns3application.py;h=681e1a11c870fa39e950a96fa992638561805f8c;hb=6285ca51026efb69642eea9dfc7c480e722d84a9;hp=b00b47f966402ca4038112bf6b4b1f4cfd5169b0;hpb=cdc84ca63a26fa2b56ee6f71d051decde6afc217;p=nepi.git diff --git a/src/nepi/resources/ns3/ns3application.py b/src/nepi/resources/ns3/ns3application.py index b00b47f9..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 @@ -17,24 +16,31 @@ # # Author: Alina Quereilhac -from nepi.execution.resource import clsinit_copy +from nepi.execution.resource import clsinit_copy, ResourceState from nepi.resources.ns3.ns3base import NS3Base @clsinit_copy 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): @@ -45,29 +51,40 @@ class NS3BaseApplication(NS3Base): def _connect_object(self): node = self.node if node.uuid not in self.connected: - self.simulator.invoke(node.uuid, "AddApplication", self.uuid) + self.simulation.invoke(node.uuid, "AddApplication", self.uuid) self._connected.add(node.uuid) - """ - def do_start(self): - if self.state == ResourceState.READY: - self.info("Starting") - - # BUG: without doing this explicit call it doesn't start!!! - # Shouldn't be enough to set the StartTime? - self.simulator.invoke(self.uuid, "Start") - - self.set_started() - else: - msg = " Failed " - self.error(msg, out, err) - raise RuntimeError, msg - def do_stop(self): if self.state == ResourceState.STARTED: - # No need to do anything, simulator.Destroy() will stop every object + # No need to do anything, simulation.Destroy() will stop every object self.info("Stopping command '%s'" % command) - self.simulator.invoke(self.uuid, "Stop") + 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: + 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