X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Flinux%2Fns3%2Fns3simulation.py;h=0a44d7aebd15cb80ff7b85e30cbc3d7037f7fef9;hb=6285ca51026efb69642eea9dfc7c480e722d84a9;hp=28a4e104549e3865c131e020e98bee2aa237e22a;hpb=2f73c5b427909b016a438b372d17fb15d2d51ede;p=nepi.git diff --git a/src/nepi/resources/linux/ns3/ns3simulation.py b/src/nepi/resources/linux/ns3/ns3simulation.py index 28a4e104..0a44d7ae 100644 --- a/src/nepi/resources/linux/ns3/ns3simulation.py +++ b/src/nepi/resources/linux/ns3/ns3simulation.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 @@ -20,7 +19,7 @@ from nepi.execution.attribute import Attribute, Flags, Types from nepi.execution.trace import Trace, TraceAttr from nepi.execution.resource import ResourceManager, clsinit_copy, \ - ResourceState, ResourceFactory, reschedule_delay + ResourceState, ResourceFactory from nepi.resources.linux.application import LinuxApplication from nepi.util.timefuncs import tnow, tdiffsec from nepi.resources.ns3.ns3simulation import NS3Simulation @@ -32,12 +31,9 @@ import os import time import threading -## TODO: Clean up DCE part. All that is DCE specific should go -## in the linux ns3dceapplication.py - @clsinit_copy class LinuxNS3Simulation(LinuxApplication, NS3Simulation): - _rtype = "LinuxNS3Simulation" + _rtype = "linux::ns3::Simulation" @classmethod def _register_attributes(cls): @@ -92,22 +88,20 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation): ns3_version = Attribute("ns3Version", "Version of ns-3 to install from nsam repo", - #default = "ns-3.19", default = "ns-3.20", #default = "ns-3-dev", flags = Flags.Design) pybindgen_version = Attribute("pybindgenVersion", "Version of pybindgen to install from bazar repo", - #default = "864", default = "868", #default = "876", flags = Flags.Design) dce_version = Attribute("dceVersion", "Version of dce to install from nsam repo (tag branch for repo)", - default = "dce-1.3", - #default = "dce-dev", + #default = "dce-1.3", + default = "dce-dev", flags = Flags.Design) populate_routing_tables = Attribute("populateRoutingTables", @@ -116,7 +110,7 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation): type = Types.Bool, flags = Flags.Design) - stoptime = Attribute("stopTime", + stoptime = Attribute("StopTime", "Time at which the simulation will stop", flags = Flags.Design) @@ -140,9 +134,8 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation): self._client = None self._home = "ns3-simu-%s" % self.guid self._socket_name = "ns3-%s.sock" % os.urandom(4).encode('hex') - self._dce_manager_helper_uuid = None - self._dce_application_helper_uuid = None self._enable_dce = None + self._dce_helper = None @property def socket_name(self): @@ -259,7 +252,7 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation): self.debug("---- RESCHEDULING DEPLOY ---- node state %s " % self.node.state ) # ccnd needs to wait until node is deployed and running - self.ec.schedule(reschedule_delay, self.deploy) + self.ec.schedule(self.reschedule_delay, self.deploy) else: if not self.get("command"): self.set("command", self._start_command) @@ -308,43 +301,25 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation): if self.get("populateRoutingTables") == True: self.invoke(IPV4_GLOBAL_ROUTING_HELPER_UUID, "PopulateRoutingTables") - self._client.start() + time = self.get("StopTime") + if time: + self._client.stop(time=time) - """ - XXX: Is this necessary?? - # Wait until the Simulation is actually started before setting the state - is_running = False - for i in xrange(200): - is_running = self.invoke(SIMULATOR_UUID, "isRunning") - is_finished = self.invoke(SIMULATOR_UUID, "isFinished") - - if is_running or is_finished: - break - else: - time.sleep(1) - else: - if not is_running: - msg = " Simulation did not start" - self.error(msg) - raise RuntimeError - """ + self._client.start() self.set_started() else: msg = " Failed to execute command '%s'" % command self.error(msg, out, err) - raise RuntimeError, msg + raise RuntimeError(msg) def do_stop(self): """ Stops simulation execution """ if self.state == ResourceState.STARTED: - time = None - if self.get("stopTime"): - time = self.get("stopTime") - - self._client.stop(time=time) + if not self.get("StopTime"): + self._client.stop() self.set_stopped() def do_release(self): @@ -360,6 +335,27 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation): super(LinuxApplication, self).do_release() + @property + def state(self): + super(LinuxApplication, self).state + + if self._state == ResourceState.STARTED: + try: + is_finished = self.invoke(SIMULATOR_UUID, "isFinished") + + if is_finished: + self.set_stopped() + except: + msg = "Simulator failed. Can not retrieve state" + out = "" + + import traceback + err = traceback.format_exc() + self.error(msg, out, err) + self.do_fail() + + return self._state + @property def enable_dce(self): if self._enable_dce is None: @@ -372,10 +368,17 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation): rm = self.ec.get_resource(guid) if isinstance(rm, rclass): self._enable_dce = True + + from nepi.resources.ns3.ns3dcehelper import NS3DceHelper + self._dce_helper = NS3DceHelper(self) break return self._enable_dce + @property + def dce_helper(self): + return self._dce_helper + @property def _start_command(self): command = []