X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fns3%2Fns3application.py;h=681e1a11c870fa39e950a96fa992638561805f8c;hb=6285ca51026efb69642eea9dfc7c480e722d84a9;hp=736dd654d154dbea2388dfdc55f1445f2258e8c6;hpb=f97424b88767d2ec6143e5264a58a740c5330d11;p=nepi.git diff --git a/src/nepi/resources/ns3/ns3application.py b/src/nepi/resources/ns3/ns3application.py index 736dd654..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,16 +16,75 @@ # # 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 = "ns3::Application" + _rtype = "abstract::ns3::Application" + + def __init__(self, ec, guid): + super(NS3BaseApplication, self).__init__(ec, guid) + self._node = None + + @property + def node(self): + 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) + + self._node = nodes[0] + + return self._node + + @property + def _rms_to_wait(self): + rms = set() + rms.add(self.node) + return rms def _connect_object(self): node = self.node - if node and node.uuid not in self.connected: - self.simulator.invoke(node.uuid, "AddApplication", self.uuid) + if node.uuid not in self.connected: + self.simulation.invoke(node.uuid, "AddApplication", self.uuid) self._connected.add(node.uuid) + def do_stop(self): + if self.state == ResourceState.STARTED: + # No need to do anything, simulation.Destroy() will stop every object + self.info("Stopping command '%s'" % command) + 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 +